Quando devo usar o ~ (til) durante a navegação pela linha de comando?

4

Bastante estúpido quando se trata de linux e estou tentando descobrir a navegação com a linha de comando. Eu posso ir e voltar da minha pasta pessoal e das pastas facilmente com isso:

cd ~/Documents/

mas quando vou abrir uma pasta em documentos, estou recebendo um erro como este:

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

Estou confuso porque preciso usar "~" para acessar documentos, mas não posso navegar para uma pasta subseqüente enquanto estiver nos documentos.

    
por Chantz Garrett 03.11.2017 / 00:14

2 respostas

16

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 e cd ~ significam alterar o diretório para sua pasta pessoal. Observe que cd ~/ 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, ~ ou cd ~testuser significaria que você deseja pular para o diretório de trabalho atual de cd ~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 em PWD , mas não em ksh .

    $ 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 em OLDPWD , mas não em ksh .

    $ 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 por bash , onde ~[+-]<NUMBER> significaria olhar da esquerda da matriz e + da direita. Isso é - específico e não funciona em bash nem ksh .

    $ 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 :

  
  1. 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.
  2.   

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 )

Veja também:

por Sergiy Kolodyazhnyy 03.11.2017 / 00:34
8

O til ( ~ ) é curto para o seu diretório pessoal (como a variável de ambiente $HOME ). Você pode executar echo ~ para ver por si mesmo. No seu caso, você verá /home/chance .

O caminho absoluto 1 do diretório que você deseja acessar é ~/Documents/xmr-stak-cpu-1.3.0-1.5.0 , então se você quiser, você pode cd direto, e isso funcionará independentemente de onde você esteja:

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

Se você já estiver em ~/Documents , poderá usar o caminho relativo 1 :

cd xmr-stak-cpu-1.3.0-1.5.0

Ou, mais detalhado, você pode usar ./ para se referir ao diretório atual:

cd ./xmr-stak-cpu-1.3.0-1.5.0

Observe também que, se você estiver no momento em ~ , haverá um caminho relativo diferente:

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

Notas de rodapé:

  1. De Wikipedia , caminhos absolutos vs caminhos relativos:

      

    Um caminho absoluto ou completo aponta para o mesmo local em um sistema de arquivos, independentemente do diretório de trabalho atual. Para fazer isso, deve incluir o diretório raiz.

         

    Por outro lado, um caminho relativo é iniciado a partir de um determinado diretório de trabalho, evitando a necessidade de fornecer o caminho absoluto completo.

por wjandrea 03.11.2017 / 00:31