Когда я должен использовать ~ (тильда) во время навигации командной строки?

Довольно глупый когда дело доходит до 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

Я смущен, потому что я должен использовать "~" для вхождения в документы, но я не могу перейти в последующую папку в то время как в документах.

5
задан 3 November 2017 в 00:42

2 ответа

TL; DR

  • путь читается слева направо с крайним левым каталогом, указанным, будучи вершиной дерева каталогов, которое Вы пересекаете
  • продвижение ~/ в пути означает Вашу домашнюю папку
  • продвижение ./ средства в этой папке или материал в текущем рабочем каталоге
  • навигация к каталогу может быть сделана через предоставление пути относительно Вашего текущего рабочего каталога или определения полного пути
  • ~ релевантно в командной строке только, не в GUI (как упомянуто в комментариях).

Ответ редактируется, чтобы включать более формальное объяснение расширения тильды и удовлетворить новому отредактированному заголовку вопроса, поэтому считайте более формальное объяснение ниже. Сначала два раздела являются более или менее нежными объяснениями того, что OP сделал и не сделал.

Проблема

Продвижение ~ (тильда), сопровождаемая наклонной чертой в пути, понята как ссылка на корневой каталог Вашего пользователя, т.е. ~/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
    

    См. схему в ответе muru на связанный вопрос, который показывает, как использовать индексы для ~+ и ~-.

Другой вещью, на которую я уже намекнул, является сброс HOME переменная среды. То, что это - переменная и может быть сброшено, создает проблему - как указано стандартом POSIX, расширение тильды зависит от переменных среды, но согласно стандарту", [я] РАЗМЕЩАЮ, сброшен, результаты неуказанные". В этом случае, 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 также:

  1. Если никакой операнд каталога не дан, и переменная Домашней среды пуста или не определена, поведение по умолчанию определяется реализацией, и никакие дальнейшие шаги не должны быть предприняты.

В отличие от этого, 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. (источник)

См. также:

17
ответ дан 23 November 2019 в 08:38

Тильда (~) коротко для Вашего корневого каталога (как переменная среды $HOME). Можно работать echo ~ лично убеждаться. В Вашем случае Вы будете видеть /home/chance.

Абсолютный path1 каталога, к которому Вы хотите получить доступ, ~/Documents/xmr-stak-cpu-1.3.0-1.5.0, таким образом, если Вы хотите, Вы можете cd прямо там, и это будет работать независимо от того, где Вы:

cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0

Если Вы уже находитесь в ~/Documents, можно использовать относительный path1:

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

Сноски:

  1. Из Википедии, полных путей по сравнению с относительными путями:

    Полный или полный путь указывает на то же местоположение в файловой системе, независимо от текущего рабочего каталога. Чтобы сделать это, это должно включать корневой каталог.

    В отличие от этого, относительный путь начинает с некоторого данного рабочего каталога, избегая потребности обеспечить полный полный путь.

9
ответ дан 23 November 2019 в 08:38

Другие вопросы по тегам:

Похожие вопросы: