Вопрос по bash – $ PWD против pwd относительно переносимости

13

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

До сих пор я использовал переменную окруженияPWD разобрать путь, но мне интересно, если

I can count on PWD to be always set to give the same result on every platform

Будет ли лучше использоватьpwd скорлупа встроенная_команда_оболочки? Мне нужно, чтобы этот скрипт работал на как можно большем количестве платформ, поэтому я просто удивился ...

Ваш Ответ

4   ответа
3

Из этой статьи на форуме,& quot; $ PWD vs `pwd` & quot; который сравнивает AIX 4.2.1, AIX 6, Sparc Solaris 10 и Redhat 5 Enterprise в этом отношении:

  • there is no difference between $PWD and builtin pwd,

  • there is no difference between builtin pwd -P and /usr/bin/pwd.

Первый показывает рабочий каталог с именами символических ссылок, тогда как второй отображает фактический путь.

Единственное расхождение заключается в том, что внешняя команда находится в / usr / bin в большинстве систем и / bin в Redhat.

19

POSIX требует$PWD быть установленным следующим образом:

PWD  

This variable shall represent an absolute pathname of the current working directory. It shall not contain any components that are dot or dot-dot. The value is set by the cd utility, and by the sh utility during initialization.

Таким образом, вы можете положиться на то, что установлено & # x2013; но запомните & quot; ... абсолютный путь ... & quot ;, а неthe абсолютный путь.

bash (по крайней мере, последние версии) будет помнить, какие символические ссылки вы использовали при настройке$PWD (иpwd встроено в него).command pwd (то есть внешняя команда) не будет. Таким образом, вы получите другие результаты, которые могут быть важными для вас. использованиеpwd -P если вы хотите путь без символических ссылок.

Обратите внимание, чтоpwd документация гласит:

If an application sets or unsets the value of PWD, the behavior of pwd is unspecified.

Так что не делай этого :)

Короче говоря, здесь нет победителя. Переменная окружения будет присутствовать в оболочках POSIX, как и внешняя команда и, возможно, встроенная команда. Выберите тот, который наилучшим образом соответствует вашим потребностям, важно то, заботитесь ли вы о символических ссылках или нет.

Спасибо @Arjun, отредактировано в.
POSIX также говорится: «Если приложение устанавливает или отменяет значение PWD, поведение pwd не определено». Возможно, вы захотите включить это в свой ответ. Это ясно указывает на то, что ни один из вариантов не должен быть «предпочтительным». (кроме в зависимости от того, хотите ли вы символические ссылки)
2

Если вы знаете, что bash доступен и скрипт выполняется с ним,PWD безопасно.

Если в некоторых системах доступен только простой sh, используйтеpwd.

0

Если бы это был я, я бы использовалpwd поскольку он встроен как для bash, так и для sh. Это не означает, что они работают одинаково во всех отношениях, но если вы вызываете его без параметров, это не имеет значения.

Похожие вопросы