TL; DR
- o caminho é lido da esquerda para a direita, com o diretório mais à esquerda especificado sendo o topo da árvore de diretórios que você está percorrendo
- levando
~/
no caminho significa sua pasta pessoal - à esquerda
./
significa nesta pasta ou no diretório de trabalho atual - navegar para um diretório pode ser feito fornecendo caminho relativo ao seu diretório de trabalho atual ou especificando o caminho completo
-
~
é relevante apenas na linha de comandos, não na GUI (como mencionado em comentários ).
A resposta é editada para incluir uma explicação mais formal da expansão do til e para se adequar ao novo título editado da pergunta, então, por favor, leia a explicação mais formal abaixo. As duas primeiras seções são explicações mais ou menos gentis do que OP fez e não fez.
O problema
O% principal co_de% (til) seguido por barra no caminho é entendido como referência ao diretório inicial do usuário, ou seja, ~
sempre significa ~/Documents
. (Há exceções e casos especiais, mas com o propósito de explicar o básico, vamos simplificar até agora; veja abaixo a explicação mais profunda).
Então, quando você faz /home/chance/Documents
, você está dizendo que me leve ao diretório cd ~/xmr-stak-cpu-1.3.0-1.5.0
que está localizado na minha pasta pessoal . O que também é importante notar, é que um caminho é sempre lido da esquerda para a direita, separado por barras, com a esquerda sendo o topo da árvore de diretórios que você referencia . Portanto, se você quiser descer de casa, para Documentos, para sua pasta, todas as partes devem estar presentes no caminho, separadas por barras, e a pasta na qual você deseja terminar, é claro, tem que ser a mais adequada. / p>
Veja a mensagem de erro de perto:
bash: cd: **/home/chance/xmr-stak-cpu-1.3.0-1.5.0**: No such file or directory
O shell% expandido xmr-stak-cpu-1.3.0-1.5.0
foi ~
e juntou-se ao que você deu. Claro, porque o diretório que você especificou não existe, você recebeu a mensagem de erro apropriada.
O que você deveria ter feito
Você pode fazer isso de duas maneiras - dê um caminho completo ou pule para /home/chance
primeiro e, em seguida, pule para o diretório desejado. Quando você ~/Documents
e deseja navegar para a pasta localizada dentro do diretório atual em que está , é possível usar a cd ~/Documents
notation. Então você faria:
$ cd ~/Documents
$ cd ./xmr-stak-cpu-1.3.0-1.5.0/
É claro que você não precisa adicionar ./
, quando simplesmente ./
irá olhar automaticamente dentro do seu diretório de trabalho atual. No entanto, é melhor ser explícito e, além disso, cd xmr-stak-cpu-1.3.0-1.5.0
ajuda a evitar problemas com nomes de arquivos que podem começar com ./
(que é um pacote totalmente diferente de problemas e é um tópico para outro dia).
Como alternativa, você pode fornecer o caminho completo:
$ cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0/
Observe que você também pode usar a variável -
em vez de $HOME
, que é praticamente a mesma em vigor, mas diferem na natureza e no material extra que você pode fazer com ~
. Veja minha resposta em CD e cd da diferença .
Explicação mais formal e detalhada
Tudo bem, até agora mantivemos as coisas bastante simples com o objetivo de explicar o básico para novos usuários. Mas há muito mais a til, dot-slash e navegar na árvore de diretórios do que isso. Os assuntos ficam mais complicados quando consideramos que til e ~
se comportam de maneira diferente em outros shells, e se considerarmos também o padrão POSIX . Algumas das coisas aqui que eu já toquei na minha resposta relacionada no Unix & amp; Linux , então não deixe de conferir também.
Em shells parecidos com o Bourne (que são cd
, bash
, ksh
implementações relacionadas como ksh
e mksh
padrão do Ubuntu, que na verdade é /bin/sh
) o til inicial sem aspas significa < href="http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_01"> Expansão de til , que é de fato especificada como comportamento padrão por POSIX. Dependendo do que segue um til principal sem aspas, tem efeitos diferentes:
-
com um
dash
sem aspas, quando não houver caracteres após (ou se não houver nada entre~
e próximo sem coeficiente~
, isto é, uma sequência nula) ele será expandido para o mesmo valor que/
environment variável, ou seja, sua pasta pessoal. Portanto,$HOME
ecd ~
significam alterar o diretório para sua pasta pessoal. Observe quecd ~/
e~
devem ser sem aspas:$ 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
-
com um
/
sem aspas, a coleção de caracteres que o seguem é considerada um possível nome de login. Portanto,~
oucd ~testuser
significaria que você deseja pular para o diretório de trabalho atual decd ~testuser/
. Mais uma vez, citando questões:$ 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
Tudo isso é um comportamento padrão e funciona em todos os níveis em testuser
, dash
e, é claro, ksh
.No entanto, existem algumas coisas que as shells fazem de maneira diferente. Em particular, bash
tem expansões extras que você pode executar com o til, e lida com uns unset bash
diferentemente de outros shells. Aqui estão as expansões extras que você pode fazer em HOME
:
-
bash
faz referência ao seu diretório de trabalho atual, o mesmo que~+
variable. Isso também funciona emPWD
, mas não emksh
.$ bash -c 'echo ~+; unset PWD;echo ~+' /home/xieerqi ~+
-
dash
faz referência ao seu diretório de trabalho anterior, igual à variável~-
. Também funciona emOLDPWD
, mas não emksh
.$ bash -c 'cd /etc/;cd /usr; echo ~-; unset OLDPWD;echo ~-' /etc ~-
-
Em
dash
, você pode navegar e registrar onde você esteve, empurrando diretórios específicos na pilha de diretórios (ou matriz), e pode referenciá-los porbash
, onde~[+-]<NUMBER>
significaria olhar da esquerda da matriz e+
da direita. Isso é-
específico e não funciona embash
nemksh
.$ bash -c 'pushd /etc/; pushd /usr; echo ~+1' /etc ~ /usr /etc ~ /etc
Veja o diagrama na resposta do muru para uma questão relacionada, que mostra como usar índices para
dash
e~+
.
Outra coisa que eu já indiquei é a variável de ambiente unset ~-
. O fato de ser uma variável e não configurável representa um problema - conforme especificado pelo padrão POSIX, a expansão do til depende das variáveis de ambiente, mas de acordo com o padrão "[i] HOME não está definido, os resultados não são especificados." Nesse caso, HOME
e ksh
simplesmente quebram:
$ 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 ~
Na verdade, isso também está de acordo com o padrão para dash
:
- Se nenhum operando de diretório for fornecido e a variável de ambiente HOME estiver vazia ou indefinida, o comportamento padrão será definido pela implementação e nenhuma outra etapa deverá ser executada.
Por contraste, cd
lida com as coisas de maneira diferente. De acordo com o manual do bash :
Se o HOME não estiver definido, o diretório inicial do usuário que está executando o shell será substituído. Caso contrário, o prefixo-til é substituído pelo diretório inicial associado ao nome de login especificado.
Em outras palavras, quando o home é apenas unset , o bash não vai quebrar, mas se bash
for setado para a string nula, ele irá quebrar:
$ bash -c 'cd /etc; unset HOME; cd ~; pwd'
/home/xieerqi
$ bash -c 'cd /etc; HOME=""; cd ~; pwd'
/etc
Fato divertido
HOME
foi escolhido para representar o diretório pessoal do usuário porque, uma vez, as chaves ~
e ~
costumavam residir na mesma tecla do terminal Lier-Siegler ADM-3A. ( fonte )