Когда я должен использовать ~ (тильда) во время навигации по командной строке?
Довольно глупо, когда дело доходит до Linux, и я пытаюсь понять навигацию с помощью командной строки. Я могу легко перемещаться из моей домашней папки и папок внутри с помощью этого:
cd ~/Documents/
но когда я иду, чтобы открыть папку в документах, я получаю сообщение об ошибке, подобное этому:
chance@asus:~/Documents$ cd ~/xmr-stak-cpu-1.3.0-1.5.0
bash: cd: /home/chance/xmr-stak-cpu-1.3.0-1.5.0: No such file or directory
Я в замешательстве, потому что мне нужно использовать "~" для доступа к документам, но я не могу перейти в следующую папку, находясь в документах.
2 ответа
TL;DR
- путь читается слева направо, с указанием крайнего левого каталога, являющегося вершиной дерева каталогов, которое вы пересекаете
- ведущий
~/
в пути означает вашу домашнюю папку - ведущий
./
означает в этой папке или вещи в текущем рабочем каталоге - перейти к каталогу можно, указав путь относительно текущего рабочего каталога или указав полный путь
~
имеет значение только в командной строке, а не в графическом интерфейсе (как указано в комментариях).
Ответ отредактирован, чтобы включить более формальное объяснение расширения тильды и соответствовать новому отредактированному названию вопроса, поэтому, пожалуйста, прочитайте более формальное объяснение ниже. Первые два раздела - более или менее мягкие объяснения того, что ОП делал и чего не делал.
Эта проблема
Ведущий ~
(тильда), сопровождаемая косой чертой в пути, понимается как ссылка на домашний каталог вашего пользователя, т.е. ~/Documents
всегда значит /home/chance/Documents
, (Существуют исключения и особые случаи, но с целью объяснения основ давайте пока все упростим; более подробное объяснение см. Ниже).
Итак, когда вы делаете cd ~/xmr-stak-cpu-1.3.0-1.5.0
говоришь, возьми меня к xmr-stak-cpu-1.3.0-1.5.0
каталог, который находится в моей домашней папке. Также важно отметить, что путь всегда читается слева направо, разделенный косыми чертами, причем крайний левый угол является вершиной дерева каталогов, на которое вы ссылаетесь. Поэтому, если вы хотите спуститься из дома, в Документы, в вашу папку, все части должны присутствовать в пути, разделенные косой чертой, и папка, в которую вы хотите попасть, конечно, должна быть самой подходящей.
Посмотрите на сообщение об ошибке внимательно:
bash: cd: **/home/chance/xmr-stak-cpu-1.3.0-1.5.0**: No such file or directory
Оболочка правильно расширена ~
быть /home/chance
и присоединился к тому, что ты дал. Конечно, поскольку указанный вами каталог не существует, вы получили соответствующее сообщение об ошибке.
Что ты должен был сделать
Вы можете сделать это одним из двух способов - дать полный путь или прыгнуть в ~/Documents
Сначала перейдите в каталог, который вы хотите. Когда ты cd ~/Documents
и вы хотите перейти к папке, которая находится внутри текущего каталога, в котором вы находитесь, вы можете использовать ./
нотации. Итак, вы бы сделали:
$ cd ~/Documents
$ cd ./xmr-stak-cpu-1.3.0-1.5.0/
Конечно, вам не нужно добавлять это ./
когда вы просто делаете cd xmr-stak-cpu-1.3.0-1.5.0
автоматически заглянет в ваш текущий рабочий каталог. Тем не менее, лучше быть явным, и к тому же ./
помогает избежать проблем с именами файлов, которые могут начинаться с -
(это совсем другой пакет проблем и тема для другого дня).
В качестве альтернативы вы можете указать полный путь:
$ cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0/
Обратите внимание, что вы также можете использовать $HOME
переменная вместо ~
, что по сути одинаково, однако они различаются по своей природе и дополнительным вещам, которые вы можете делать с ~
, Смотрите мой ответ на разницу CD и CD ~.
Более формальное и глубокое объяснение
Хорошо, до сих пор мы держали вещи довольно просто с целью объяснения основ для новых пользователей. Но есть гораздо больше, чем тильда, косая черта и навигация по дереву каталогов. Вопросы становятся более сложными, если учесть, что тильда и cd
ведут себя по-разному в других оболочках, и если мы также рассмотрим стандарт POSIX. Некоторые из вещей, о которых я здесь уже упоминал, в своем ответе по Unix и Linux, так что обязательно проверьте это.
В борновоподобных оболочках (то есть bash
, ksh
, ksh
связанные реализации, такие как mksh
и Ubuntu по умолчанию /bin/sh
что на самом деле dash
) ведущая тильда без кавычек означает расширение тильды, которое фактически определяется как стандартное поведение POSIX. В зависимости от того, что следует за ведущей тильдой без кавычек, она имеет разные эффекты:
с не цитируемой лидирующей
~
, если после него нет символов (или если между~
и следующий без кавычек/
т. е. пустая строка) расширяется до того же значения, что и$HOME
переменная окружения, т.е. ваша домашняя папка. Такcd ~
а такжеcd ~/
значит смени каталог на свою домашнюю папку. Обратите внимание, что~
а также/
должно быть без кавычек:$ bash -c 'cd /etc/; ls -d ~' /home/xieerqi $ bash -c 'cd /etc/; ls -d ~/' /home/xieerqi/ $ bash -c 'cd /etc/; ls -d ~"/"' ls: cannot access '~/': No such file or directory $ bash -c 'cd /etc/; ls -d "~"/' ls: cannot access '~/': No such file or directory
с не цитируемой лидирующей
~
Коллекция символов, которые следуют за ним, считаются возможным именем входа. Такcd ~testuser
или жеcd ~testuser/
будет означать, что вы хотите прыгнуть вtestuser
текущий рабочий каталог. Опять же, цитирование имеет значение:$ bash -c 'cd /etc/; ls -d ~testuser' /home/testuser $ bash -c 'cd /etc/; ls -d ~"testuser"' ls: cannot access '~testuser': No such file or directory $ bash -c 'cd /etc/; ls -d ~testuser"/"' ls: cannot access '~testuser/': No such file or directory
Это все стандартное поведение и работает по всем направлениям в dash
, ksh
и конечно bash
, Однако есть несколько вещей, которые оболочки делают по-другому. Особенно, bash
имеет дополнительные расширения, которые вы можете выполнить с тильдой, и обрабатывает неустановленные HOME
иначе, чем другие оболочки. Вот дополнительные расширения, которые вы можете сделать в bash
:
~+
ссылается на ваш текущий рабочий каталог, так же, какPWD
переменная. Это также работает вksh
но нетdash
,$ bash -c 'echo ~+; unset PWD;echo ~+' /home/xieerqi ~+
~-
ссылается на ваш предыдущий рабочий каталог, так же, какOLDPWD
переменная. Также работает вksh
но нетdash
,$ bash -c 'cd /etc/;cd /usr; echo ~-; unset OLDPWD;echo ~-' /etc ~-
В
bash
вы можете перемещаться и записывать, где вы были, помещая определенные каталоги в стек каталогов (или массив), и вы можете ссылаться на них с помощью~[+-]<NUMBER>
, где+
будет означать, что смотреть слева от массива, и-
справа Этоbash
конкретные и не работают, работают вksh
ниdash
,$ bash -c 'pushd /etc/; pushd /usr; echo ~+1' /etc ~ /usr /etc ~ /etc
Смотрите диаграмму в ответе Муру на связанный вопрос, который показывает, как использовать индексы для
~+
а также~-
,
Еще одна вещь, на которую я уже намекал, это HOME
переменная окружения. Тот факт, что она является переменной и может быть неустановленной, создает проблему - как указано в стандарте POSIX, расширение тильды зависит от переменных среды, но в соответствии со стандартом "[i] HOME не установлен, результаты не определены". В этом случае, ksh
а также dash
просто сломать
$ ksh -c 'cd /usr; unset HOME; cd ~'
ksh: cd: xieerqi: [No such file or directory]
$ dash -c 'cd /usr; unset HOME; cd ~'
dash: 1: cd: can't cd to ~
Фактически это соответствует стандарту cd
также:
- Если операнд каталога не задан, а переменная среды HOME пуста или не определена, поведение по умолчанию определяется реализацией, и дальнейшие действия не предпринимаются.
В отличие от bash
, обрабатывает вещи по-разному. Согласно руководству по bash:
Если HOME не установлен, вместо него подставляется домашний каталог пользователя, выполняющего оболочку. В противном случае префикс тильды заменяется домашним каталогом, связанным с указанным именем входа.
Другими словами, когда дом не установлен, bash не сломается, но если HOME
устанавливается в нулевую строку, она будет ломаться:
$ bash -c 'cd /etc; unset HOME; cd ~; pwd'
/home/xieerqi
$ bash -c 'cd /etc; HOME=""; cd ~; pwd'
/etc
Забавный факт
~
был выбран для представления домашнего каталога пользователя, потому что один раз ~
а также HOME
клавиши, используемые на той же клавиатуре на терминале Lier-Siegler ADM-3A. ( источник)
Смотрите также:
Тильда (~
) это сокращение от вашего домашнего каталога (например, переменная окружения) $HOME
). Вы можете запустить echo ~
чтобы убедиться в этом. В вашем случае вы увидите /home/chance
,
Абсолютный путь к каталогу, ккоторому вы хотите получить доступ, равен ~/Documents/xmr-stak-cpu-1.3.0-1.5.0
, так что если вы хотите, вы можете cd
прямо там, и это будет работать независимо от того, где вы находитесь:
cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0
Если вы уже в ~/Documents
Вы можете использовать относительный путь1:
cd xmr-stak-cpu-1.3.0-1.5.0
Или, более подробный, вы можете использовать ./
чтобы обратиться к текущему каталогу:
cd ./xmr-stak-cpu-1.3.0-1.5.0
Также обратите внимание, что если вы в настоящее время в ~
есть другой относительный путь:
cd Documents/xmr-stak-cpu-1.3.0-1.5.0
Примечания:
Из Википедии, абсолютные пути против относительных путей:
Абсолютный или полный путь указывает на одно и то же место в файловой системе, независимо от текущего рабочего каталога. Для этого он должен включать корневой каталог.
Напротив, относительный путь начинается с некоторого заданного рабочего каталога, избегая необходимости указывать полный абсолютный путь.