Мне интересно, если один только CD отправляет меня в мою домашнюю папку, а cd ~ делает то же самое, почему тогда ~ был добавлен в первую очередь?
Это что-то особенное для BASH или они будут вести себя по-другому в другой оболочке?
Мне интересно, если один только CD отправляет меня в мою домашнюю папку, а cd ~ делает то же самое, почему тогда ~ был добавлен в первую очередь?
Это что-то особенное для BASH или они будут вести себя по-другому в другой оболочке?
Ответы:
~
Может быть использован для более чем просто. Любая команда может получить выгоду от наличия ярлыка для домашней папки. Так что нет необходимости, если вы хотите, чтобы CD в ваш дом, но как насчет ~/.config
?
$ cd ~/.config
В противном случае вам придется выписать домашний путь, использовать $HOME
переменную var или сделать две cd
s. Также для копирования или перемещения файлов:
$ cp ~/downloads/some-file some/path/
Поскольку большинство ваших файлов находятся дома, всегда полезно иметь ярлык.
~
это сделать, cd ~user/download
чтобы перейти в каталог загрузки пользователя.
В cd
основном это вызов cd
без аргументов и в соответствии с cd
поведением «... если dir не указан, значение переменной оболочки HOME является значением по умолчанию». (из руководства Bash ). Напротив, cd ~
это когда вы передаете аргумент cd
команде, что происходит, ~
и shell выполнит расширение тильды . Что касается возврата в домашний каталог пользователя - нет никакой разницы. В любом случае HOME
переменная окружения будет запрошена:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
По сути, это также не имеет никакого отличия от cd $HOME
. Однако, в то время как cd
будет делать одно-единственное, тильду можно использовать для выполнения других расширений, например ~+
для текущего рабочего каталога.
Однако, что интересно, мы можем unset HOME
сломаться, cd
но ~
все равно будем работать:
$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'
bash: line 0: cd: HOME not set
/usr
/home/xieerqi
Почему ? Опять же, ответьте в руководстве:
Если HOME не задан, вместо него подставляется домашний каталог пользователя, выполняющего оболочку. В противном случае префикс тильды заменяется домашним каталогом, связанным с указанным именем входа.
Обратите внимание, что сброс не отличается от создания пустой переменной HOME=
и имеет эффект. Документация конкретно говорит о сбрасывании переменной. Создание переменной равной пустой строке имеет эффект, противоположный тому, что мы ожидали:
bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr
Здесь вы можете увидеть, что создание HOME
пустой строки нарушает как тильду, так и cd
поведение.
Тильда и $HOME
есть какая то разница и другая причина существования. $HOME
является переменной оболочки, которая также случайно оказывается одной из переменных среды - и которая доступна для всех программ; в C вы будете использовать environ()
для доступа к этому. В отличие от этого, tilde
это специфичный для оболочки синтаксис, который выполняет раскрытие тильды, хотя вы можете использовать wordexp()
функцию для выполнения подобного оболочке расширения ( ссылки ) также в Си.
Причина, по которой ~
представитель представляет HOME
ответ в этом вопросе : однажды персонаж тильды поделился тем же ключом с HOME
терминалом Lear-Siegler ADM-3A. HOME
напротив, переменная окружения имела чисто символическое значение и не имела физических представлений.
Кроме того, тот факт, что HOME
это переменная окружения, позволяет нам ее сбрасывать, поскольку мы не можем установить ~
что-то еще с помощью простых средств.
# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'
/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'
/home/xieerqi
Обратите внимание на пустую строку, где сначала echo
выводится неустановленная переменная, и тот факт, что. В отличие от этого, мы не можем делать такие вещи для тильды:
$ bash -c '~=; cd ~;pwd'
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi
Однако изменение HOME
влияет на ~
:
$ env 'HOME=' bash -c 'echo $HOME; stat ~;'
stat: cannot stat '': No such file or directory
Кроме того, поскольку он ~
также работает как символ расширения, мы можем сделать что-то вроде этого, чтобы показать текущий рабочий каталог:
$ bash -c 'cd /etc/;stat -c "%n" ~+'
/etc
Принимая во внимание, что если мы хотим сделать это через переменные окружения, нам нужно PWD
и HOME
остается тем же самым, или если вы делаете что-то подобное echo $HOME+
- это просто конкатенация строк / переменных. Но опять же, ~+
берет информацию из переменных среды:
$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'
/usr
Примечание : ~+
и ~-
расширения работы в ksh
, но не в dash
.
Чтобы ответить на некоторые ваши конкретные вопросы:
Это что-то особенное для BASH или они будут вести себя по-другому в другой оболочке?
Нет, это должно быть последовательное поведение. ksh
, dash
и csh
- все ведут себя одинаково с cd
или cd ~
.
почему ~ был добавлен в первую очередь тогда?
Я бы сказал, удобство и исторические причины, как объяснено в связанном ответе о тильде. В конце концов, он вырос не только для расширения домашнего каталога.
Независимо от того, находитесь ли вы на нескольких уровнях папок выше или ниже $HOME
, команды cd
и cd ~
делают одно и то же и не отличаются - он отправит вас обратно в ваш каталог HOME.
ОДНАКО: Когда вы находитесь на 1 или более уровней папок выше HOME и хотите перейти ПРЯМО в подкаталог на 1 или более уровней папок ниже $HOME
, функция tilde ( ~
) оказывается полезной благодаря сохранению нажатий клавиш при замене текста, необходимого для ссылки чтобы $HOME
при вводе cd
команды. Например;
/$ cd # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3 # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
~ обозначает / home / username location, поэтому вы экономите время при наборе текста. Например, cd / home / username / Downloads такой же, как cd ~ / Downloads, но меньше печатает. Обе команды делают то же самое, измените рабочий каталог на это место.
root
, домашний каталог обычно находится снаружи/home
cd ~
противcd $HOME
противcd ~not-tandu
. Этот вопрос задает оcd
противcd ~
.