2015-02-06 10 views
1

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

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 Баш 3,2

+3

В 'BASH' это портативное поведение. Взгляните на: [Расширение Тильды] (https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html) – user3439894

+2

@ user3439894, это правда ** ЕСЛИ НЕ ЦИТАТЫ **. Quoting предотвращает расширение тильды, даже если присваивается переменной. Это явно указано в документах, которые вы указали: «Каждое присваивание переменной проверено для * неупорядоченных * тильд-префиксов» –

+0

@Charles Duffy, ладно, я думаю, отныне я квалифицирую все, что говорю! Да, он переносится, когда это делается в рамках правил, и поэтому я включил ссылку в свой первый комментарий, так как я ожидаю, что пользователи тоже будут RT * M! – user3439894

ответ

2

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

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

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

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

+0

Я не знал, что о назначениях - спасибо. Кроме того, я просто попробовал систему centos 6, и она там тоже работала. Поэтому, возможно, это неопределенное, но в основном последовательное поведение. –

+2

@AmadeusDrZaius Посмотрите: [Литеральная тильда в PATH плохо работает через программы.] (Https://github.com/koalaman/shellcheck/wiki/SC2147) – user3439894

+0

@ user3439894 Спасибо за ссылку - хороший ресурс. –

 Смежные вопросы

  • Нет связанных вопросов^_^