Что делает cd ~ при входе в окно терминала
Вы никогда не задумывались, что такое следующий символ?
~ Называется тильдой и происходит от латинского слова для Titulus и, согласно Википедии, оно пришло к английскому языку через испанский язык. Это значение тильда или надпись.
В Linux символ тильды (~) – это то, что известно как метасимвол, и в пределах оболочки терминала он имеет особое значение.
Итак, что именно делает следующая команда:
Приведенная выше команда просто возвращает вас в ваш домашний каталог. Это отличный способ. Если вы перешли в другую папку, такую как/var/logs или/mnt и т. Д., То после ввода cd ~ вы вернетесь в домашний каталог вашего пользователя.
Хотя тильда (~) делает больше, чем это.
Хотя использование тильды само по себе приведет вас в домашний каталог текущего пользователя, вы можете перейти в домашний каталог другого пользователя, введя имя пользователя после тильды.
Например, если в вашей системе есть пользователь с именем Fred, вы можете перейти в его домашнюю папку, набрав следующее:
Другое использование тильды – возврат к предыдущему рабочему каталогу. Представьте, что вы только что перешли в домашнюю папку Фреда из папки/var/logs. Вы можете вернуться в папку/var/logs, набрав следующее:
Противоположностью ~ – является ~ + , который при использовании с командой cd переносит вас в текущий рабочий каталог. Это, конечно, не особенно полезно, потому что вы уже находитесь в текущем рабочем каталоге.
Введите cd ~ в терминал и нажмите клавишу табуляции, чтобы получить список всех возможных папок, в которые вы можете перейти.
Чтобы перейти в папку с играми, введите следующее:
Это приведет вас в папку/usr/games.
Обратите внимание, что не все перечисленные параметры работают с командой cd.
Последняя пара вариантов использования тильды:
Эта запись позволяет вам перемещаться по стеку каталогов. Папки могут быть добавлены в стек каталогов с помощью pushd.
Например, если вы находитесь в своей музыкальной папке и хотите, чтобы она появилась в стеке каталогов, введите следующее:
Теперь введите следующую команду dirs:
Это показывает список всех элементов в стеке.
Подумайте о стеке в его физической форме. Представьте, что у вас есть стопка журналов. Чтобы добраться до второго магазина внизу, вам нужно снять один сверху, чтобы добраться до него.
Представьте, что у вас есть стек следующим образом:
0. Музыка
1. Загрузки
2. Сценарии
Использование термина CD ~ 2 приведет вас к папке на второй позиции в стеке. Обратите внимание, что первая позиция всегда является текущей папкой, поэтому в следующий раз, когда вы введете dirs -v , вы увидите следующее:
0. Сценарии
1. Загрузки
2. Сценарии
Если вы вернетесь в папку «Музыка», позиция 0 снова будет «Музыка».
Команда cd не единственная команда, которая работает с тильдой (~). Команда ls также работает.
Например, чтобы вывести список всех файлов в вашей домашней папке, введите следующее:
Тильда также используется в именах файлов и обычно создается как резервная копия текстовыми редакторами.
Тильда является одним из многих метасимволов, используемых в Linux. Другие метасимволы включают точку или точку (.), Которая используется для обозначения текущей позиции при навигации по файловой системе, звездочка (*) используется в качестве символа подстановки при поиске, как и знак вопроса (?).
Символ карата (^) используется для обозначения начала строки или строки, а символ доллара используется для обозначения конца строки или строки во время поиска.
Когда я должен использовать ~ (тильда) во время навигации по командной строке?
Довольно глупо, когда дело доходит до Linux, и я пытаюсь понять навигацию с помощью командной строки. Я могу легко перемещаться из моей домашней папки и папок внутри с помощью этого:
но когда я иду, чтобы открыть папку в документах, я получаю сообщение об ошибке, подобное этому:
[email protected]:~/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
$ 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 ~+
$ bash -c 'cd /etc/;cd /usr; echo ~-; unset OLDPWD;echo ~-' /etc ~-
$ 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. ( источник)