Согласно этому ответу и моему собственному пониманию, тильда расширяется до домашнего каталога:
$ echo ~
/home/braiam
Теперь, когда я хочу, чтобы раскрытие оболочки работало, то есть с использованием таких имен переменных $FOO
, а не прерывалось из-за непредвиденных символов, таких пробелов и т. Д., Следует использовать двойные кавычки "
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Почему это расширение не работает с тильдой?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
--path ~/myfile
расширяется, но--path=~/myfile
не расширяется .Ответы:
Причина в том, что внутри двойных кавычек тильда
~
не имеет особого значения, она трактуется как буквальная.POSIX определяет двойные кавычки как:
За исключением случаев $, `, \и @, другие символы рассматриваются как литералы в двойных кавычках.
источник
$HOME
.~
, напримерls -l ~/"My Documents"
Расширение тильды определяется POSIX как:
Таким образом, самый короткий ответ «потому что он определен таким образом»: цитирование любого из символов в префиксе, в том числе
~
, запрещает расширение.Он также определяет расширение как всегда приводящее к одному слову, поэтому в кавычках нет необходимости:
Если для некоторого пути требуется цитирование, а для остального - префикс тильды, вы можете напрямую объединить расширение тильды и обычное цитирование:
В более широком смысле «почему»: поскольку для разделения слов не существует мыслимого использования
~
, это должно быть поведение по умолчанию, а не требование его заключать в кавычки. Поскольку нет необходимости~
заключать его в кавычки, придание особого значения внутри кавычек было бы ненужным осложнением. И, конечно же, исторические причины означают, что его нельзя изменить сейчас, даже если это было бы желательно.источник
""
.~
происходит в C-оболочке задолго до того, как она была добавлена в оболочку Korn, а затем добавлена в спецификацию оболочки POSIX.В C-оболочке
~
был оператор сглаживания (расширенный той же самой процедурой, что и расширяющий,*.txt
например), поэтому, как и остальная часть смещения, не выполнялась в двойных кавычках.источник
Хотя это не отвечает на вопрос, почему он разработан таким образом,
$HOME
вместо этого вы используете, если вам нужно заменить, поскольку это, по сути, то, что~
делает.источник
~otheruser
~otheruser
показывает, какая плохая идея - обращаться с~
переменными и другими вещами, которые раскрываются в двойных кавычках.