2

Есть ли разница между этими (почти одинаковыми) командами каталога?

1. cd
2. cd ~
3. cd ~/

Я попробовал это в своей оболочке, и все они ведут в домашний каталог. Есть ли возможный сценарий, где они разные?

2 ответа2

9

POSIX определяет это ...

  1. ... если cd не было задано никаких аргументов, он будет использовать значение $HOME если переменная установлена, и не будет делать ничего другого (хотя он также говорит, что результаты не определены). - cd

  2. ... если аргумент ~ или начинается с ~/ , тильда будет расширена до значения $HOME если переменная установлена; результаты не указаны иначе. - tilde expansion

Так что если установлено значение $HOME , то все три команды эквивалентны. (Дополнительные косые черты после имен каталогов не имеют смысла.)


Однако, если $HOME не установлена, то результаты как ~ -разложении и cd - диск не определены:

  • В bash, AT & T ksh и Heirloom sh обычный cd завершится с ошибкой "без домашнего каталога".

  • В csh, zsh, dash и MirBSD mksh обычный cd ничего не сделает.

  • В tcsh обычный cd будет искать домашний каталог с помощью getpwuid() .

Что касается ~ расширения ...

  • bash и tcsh развернутся ~ до домашнего каталога из getpwnam() .

  • AT & T ksh расширит ~ ваше имя пользователя (?!).

  • В csh и zsh ~ развернется в пустую строку. (поэтому cd ~ ничего не будет делать, как обычный cd , в этих оболочках.)

  • В тире и MirBSD МКШ, то ~ останется буквальным ~ (Использование cd ~ попытается перейти в каталог с таким именем.)

  • Фамильные ш никогда не расширится ~ даже если $HOME установлен - это , вероятно , предшествует конвенции.

Из них только csh и zsh придерживаются определения POSIX расширения ~ до значения $HOME даже если оно пустое.

(Оболочка fish всегда устанавливает $HOME из getpwnam() при запуске, если переменная пуста, и впоследствии отказывается ее изменять.)

0

Ну, я могу представить сценарий, где 1 отличается от 2 и 3. Попробуйте определить следующую функцию в bash:

cd () { if (($#)) ; then builtin cd "$1" ; else cd / ; fi ; }
  1. отвезет вас в / , а 2. и 3. отвезет вас домой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .