Почему вывод _$ _ выполняется на терминале?
Я выполнил следующую последовательность команд:
$ now=$(date)
$ echo _$now_
_
$ echo _ $now _
_ Mon Sep 22 09:53:44 IST 2014 _
Почему вывод _$now_
только _
?
4 ответа
От man bash
:
DEFINITIONS
The following definitions are used throughout the rest of this document.
blank A space or tab.
word A sequence of characters considered as a single unit by the shell.
Also known as a token.
name A word consisting only of alphanumeric characters and underscores,
and beginning with an alphabetic character or an underscore. Also
referred to as an identifier.
...
PARAMETERS
A parameter is an entity that stores values. It can be a name, a number,
or one of the special characters listed below under Special Parameters.
A variable is a parameter denoted by a name.
Переменная может содержать только буквы, цифры и подчеркивания. Так что now_
является допустимым именем переменной и интерпретируется как таковой.
Вы можете разделить имя переменной по-разному:
_"$now"_
_${now}_
_$now"_"
_$now'_'
Или любая комбинация вышеперечисленного.
Так как _
является частью имени переменной в вашем echo _$now_
использование echo \_$now\_
вместо.
Также вы можете использовать это только в линейной команде: echo _$(date)_
Потерпи меня немного, это требует объяснения.
Во-первых, почему вывод _ $(date) _
является _ Mon Sep 22 03:30:34 MDT 2014 _
? Потому что это буквально говорит echo: сначала вывести _, затем вывести $(date), а затем _ . Пробелы разделяют переменные для эха.
Сейчас попробуй echo _$(date)
, обратите внимание, нет места между _
а также $(date)
, В этом случае вывод будет _Mon Sep 22 03:32:40 MDT 2014
, Что это делает? ты говоришь echo
объединить подчеркивание с выводом $(date)
,
Попробуйте то же самое с _$PWD
, который объединит ваш рабочий каталог с подчеркиванием. Сейчас попробуй echo $PWD_
, Вывод будет пустым. Зачем? так как PWD_
является несуществующей переменной среды, и, как уже упоминали другие _
является допустимым символом для переменной среды, например $XDG_CURRENT_DESKTOP
,
Так почему _$PWD_
даст _
? Потому что вы говорите echo
соединять _
с выводом несуществующей переменной среды. Так _
печатается, но $PWD_
вывод пуст, так что вы буквально видите _
соединены с этим пустым выводом.
_$now_
интерпретируется как
_${now_}
которая в вашем случае, очевидно, является строкой concat '_' и ''. Используйте поэтому
_${now}_
вместо. Гораздо понятнее читать.