Почему 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отслеживает текущий каталог, поэтому получение значения обходится без затрат, в то время как внешней команде необходимо искать в файловой системе, чтобы определить путь, который требует гораздо больше операций ввода-вывода.


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предоставьте сводку).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.