расширение тильды при оценке $PATH

В моей системе*

cd                                                 # move to home
mkdir tempdir
PATH="$PATH:~/tempdir"                             # put tempdir in path
touch tempdir/tempscript
echo -e '#!/bin/bash\necho h' > tempdir/tempscript # write script
chmod u+x tempdir/tempscript                       # make executable
tempscript                                         # execute

найдет скрипт tempdir/tempscript и напечатает h.

Однако, если мы повторим $PATH, мы увидим ~/tempdir в конце, поэтому он не расширен. Именно этого мы и ожидаем, поскольку мы заключаем присваивание в двойные кавычки.

Однако я не могу найти никакой документации о том, почему расширение тильды происходит при оценке $PATH. (Обратите внимание, что переменная PATH по-прежнему содержит ~.)

Это портативное поведение?

* Mac OS X с GNU bash 3.2


person Chris Middleton    schedule 06.02.2015    source источник
comment
В BASH это переносимое поведение. Взгляните на: Расширение Тильды   -  person user3439894    schedule 06.02.2015
comment
@user3439894 user3439894, это правда, ЕСЛИ НЕ ЦИТИРОВАНО. Кавычки предотвращают раскрытие тильды, даже при назначении переменной. Это явно указано в документах, на которые вы ссылаетесь: каждое назначение переменной проверяется на наличие префиксов без кавычек.   -  person Charles Duffy    schedule 06.02.2015
comment
@Чарльз Даффи, хорошо, я думаю, с этого момента я проверяю все, что говорю! Да, это переносимо, если это сделано в рамках правил, и поэтому я включил ссылку в свой первый комментарий, поскольку я ожидаю, что пользователи тоже будут RT * M!   -  person user3439894    schedule 06.02.2015
comment
@ user3439894, ... но ОП явно продемонстрировал цитируемое задание. Разумный читатель мог бы ожидать, что это относится к коду, приведенному в этой демонстрации.   -  person Charles Duffy    schedule 06.02.2015
comment
@CharlesDuffy \@user3439894 В чем-то вы оба правы. Я сделаю часть кавычек более явной в своем вопросе.   -  person Chris Middleton    schedule 06.02.2015
comment
Кстати, при тестировании я бы предложил использовать программу, отличную от оболочки, для выполнения дочерней программы. Выполнение программы по пути, разделенному тильдой, через xargs или аналогичный инструмент будет иметь такой эффект.   -  person Charles Duffy    schedule 06.02.2015
comment
@Чарльз Даффи, хорошо, я пропустил кавычки в задании в ОП! :)   -  person user3439894    schedule 06.02.2015


Ответы (1)


Нет, это не портативно. Если вызов execl вашей операционной системы не выполняет это расширение, программы, которые не являются bash, не смогут найти исполняемые файлы в заданном каталоге.

Обратите внимание, что если вы не указали расширение, это было бы безопасно:

PATH=$PATH:~/tempdir   # this is safe -- expansion happens before assignment
PATH="$PATH:~/tempdir" # this is not -- readers are required to expand

Хотя обычно лучше заключать в кавычки все расширения оболочки, это не обязательно для присваиваний, которые неявным образом предотвращают разбиение строк и поведение подстановок.

person Charles Duffy    schedule 06.02.2015
comment
Я не знал, что о назначениях - спасибо. Кроме того, я только что попробовал систему Centos 6, и там тоже все заработало. Так что, возможно, это неопределенное, но в основном последовательное поведение. - person Chris Middleton; 06.02.2015
comment
@AmadeusDrZaius Взгляните на: Буквальная тильда в PATH плохо работает в разных программах. - person user3439894; 06.02.2015