Есть ли разница между этими (почти одинаковыми) командами каталога?
1. cd
2. cd ~
3. cd ~/
Я попробовал это в своей оболочке, и все они ведут в домашний каталог. Есть ли возможный сценарий, где они разные?
POSIX определяет это ...
... если cd не было задано никаких аргументов, он будет использовать значение $HOME если переменная установлена, и не будет делать ничего другого (хотя он также говорит, что результаты не определены). - cd
... если аргумент ~ или начинается с ~/ , тильда будет расширена до значения $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() при запуске, если переменная пуста, и впоследствии отказывается ее изменять.)
Ну, я могу представить сценарий, где 1 отличается от 2 и 3. Попробуйте определить следующую функцию в bash:
cd () { if (($#)) ; then builtin cd "$1" ; else cd / ; fi ; }
/ , а 2. и 3. отвезет вас домой.