Почему pwd не принимает длинные опции, такие как --physical?

11

Когда я отображаю руководство для pwdкоманды, он говорит, что --physicalподдерживаются длинные опции, такие как

$ man pwd
PWD(1)                           User Commands                          PWD(1)

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

Тем не менее, это не удается, когда я набираю следующее

$ pwd --physical
-bash: pwd: --: invalid option
pwd: usage: pwd [-LP]

Почему длинные варианты не работают для меня?

Я использую RHEL 6.4. Псевдоним для pwd не настроен. Похоже, это стандартный pwd:

$ which pwd
/bin/pwd
Михал Кордас
источник
1
Страница руководства предназначена для автономной утилиты, которая не является частью bash.
Томас Дики
7
Используйте typeвместо which, поскольку whichтолько показывает команды, а typeпоказывает ключевые слова, встроенные функции, псевдонимы, функции и команды (и хэшированные пути команд). Для более подробной информации смотрите Почему бы не использовать «который»? Что использовать тогда?
wjandrea
1
В моей системе man pwdесть следующее примечание: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supportsвнизу DESCRIPTIONраздела.
Никакин

Ответы:

26

bashимеет встроенную команду, pwdкоторую вы используете, когда вы просто печатаете pwdв своей оболочке.

Чтобы получить, pwdкак описано в man-странице, вам необходимо принудительное использование внешней команды. Вы можете сделать это, указав полный путь к исполняемому файлу ( /bin/pwdв вашем случае) или добавив envперед строкой:, env pwdкоторая запускает envкоманду, которую можно использовать для добавления настроек в среду (но здесь это не делается), а затем envзапускает указанная команда. Поскольку envне имеет встроенной функции pwd, «реальное» /bin/pwdвыполняется.

Преимущество встроенного pwdв bash заключается в том, что он bashотслеживает текущий каталог, поэтому получение значения обходится без затрат, в то время как внешней команде необходимо искать в файловой системе, чтобы определить путь, который требует гораздо больше операций ввода-вывода.

wurtel
источник
4
Это не так, как на самом деле работает внешняя команда. unix.stackexchange.com/a/413225/5132
JdeBP
Кстати: вы также можете отключить встроенную оболочку (по крайней мере, в bash) с помощьюenable -n pwd
derobert
@JdeBP Раньше я смотрел в последний раз (давным-давно :-)); и хотя теперь он использует getcwd()системный вызов, ядро ​​по-прежнему пересекает файловую систему, что легче сделать в пространстве ядра благодаря доступу к соответствующим структурам данных, как говорится в связанном ответе: «Однако обратите внимание, что даже во FreeBSD и других работающих систем ядро ​​не отслеживает рабочий каталог со строкой. "
wurtel
11

Эта man-страница документирует /bin/pwd, но при запуске pwdвы используете встроенную оболочку; увидеть вывод

type pwd

Встроенная в вашу оболочку pwdне поддерживает длинные опции (см. Документацию вашей оболочки; поскольку вы используете Bash, help pwdпредоставьте сводку).

Стивен Китт
источник