Есть ли разница между этими (почти одинаковыми) командами каталога?
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. отвезет вас домой.