Como o uso do til funciona como um atalho para meu diretório pessoal?

29

Eu estava confuso, tentando copiar alguns arquivos de um PC para outro. Eu descobri, mas a sintaxe ainda é confusa para mim. Isso funciona:

scp ~/Desktop/Volenteer.png [email protected]:~j0h/b

que coloca Volenteer.png na pasta /home/j0h/b . No entanto, isso não funciona:

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

Isso também falha, dando um arquivo de status de saída 1 não encontrado:

scp ~/Desktop/Volenteer.png     [email protected]:~/j0h/b

Como isso:

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

Então, claramente, há alguma diferença entre ~ e ~/ Essa diferença é a presença de /

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

Então, por que no scp, o ~ resolve para ~/ ? Isso é um palpite, não posso verificar o que está acontecendo. Mas parece inconsistente e, portanto, confuso. Isso é um bug no scp? ou há algo sobre til eu estou faltando?

    
O
por j0h 05.08.2015 / 15:42

4 respostas

66

~ é o seu diretório inicial.

~foo é o diretório inicial do usuário foo , se tal usuário existir, ou apenas um diretório chamado ~foo , se esse usuário não existir.

Por isso, em:

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

~Desktop será expandido para o diretório home do usuário Desktop , se esse usuário existir (e geralmente não existe), ou seja apenas ~Desktop (um caminho que normalmente também não existe).

Em:

scp ~/Desktop/Volenteer.png     [email protected]:~/j0h/b

~/j0h expandirá para um diretório chamado j0h in jay , que, de novo, é improvável que exista.

Não é ~ e ~/ onde a diferença ocorre, mas em ~ e ~foo .

Além disso, ~ também pode ser usado para navegação no histórico de diretórios:

  • ~- é o diretório de trabalho anterior (como $OLDPWD )
  • ~+ é o diretório de trabalho atual (como $PWD )

Isso não se aplica a scp , pois você não pode alterar os diretórios no meio de uma operação scp .

E se você usar pushd e popd para manter uma pilha de diretórios, ~N e ~+N seria o diretório N th na pilha de diretórios, como visto na saída de dirs . ~-N seria o diretório N th do final (contando a partir de zero, em ambos os casos). Por exemplo:

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

Em seguida, os diretórios na pilha podem ser acessados usando:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-
    
por muru 05.08.2015 / 16:12
21

Faça uma leitura da documentação do GNU para a Expansão do Bash Tilde ( como eu deveria ter antes da minha primeira iteração desta resposta).

~/Desktop e ~j0h estão fazendo coisas fundamentalmente diferentes, o que explica por que ~Desktop não funciona:

  • Um ~ simples é substituído pela variável de ambiente $HOME atual, definida no login. Então ~ resolve para /home/oli para mim e ~/Desktop lê como /home/oli/Desktop . É aqui que você vê a tilda mais usada.

  • ~username resolve o endereço do usuário , conforme definido em /etc/passwd . Portanto, ~oli resolve para /home/oli , ~j0h pode resolver para /home/j0h , mas não necessariamente, seu homedir pode estar em qualquer lugar.

  • ~not-a-username não resolve. Como Desktop não é um usuário, ~Desktop não é substituído. É tomado literalmente como um arquivo ou caminho chamado ~Desktop (que não existe aqui).

E nem é preciso dizer que tudo isso está acontecendo remotamente (seria inútil em scp se fosse substituído por valores locais). Isso funciona porque o Bash não substituirá ~... se for precedido por qualquer outra coisa que não seja espaço em branco.

    
por Oli 05.08.2015 / 15:54
4

O símbolo ~ é usado como um atalho para /home/user em bash , portanto, no caso de ~/Desktop/Volenteer.png , é um atalho para /home/user/Desktop/Volenteer.png .

Então, como você pode ver, o / , como sempre, mostra um novo nível na hierarquia do sistema de arquivos.

    
por Mark Kirby 05.08.2015 / 15:49
4

~ é uma abreviação para a variável de ambiente $HOME na maioria dos derivativos de shell c / suportando shells compatíveis com POSIX. o uso mais comum de ~ é ao fazer referência ao seu diretório pessoal ou ao da casa de outro usuário:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

Para localizar o diretório home para qualquer usuário local em um sistema POSIX (UNIX, Linux, OS X, BSD) que esteja usando o banco de dados passwd (5) executado awk em /etc/passwd da seguinte forma:

awk -F: '{ print ,$(NF-1) }' /etc/passwd

Isso listará cada usuário local e seu diretório inicial.

    
por Dwight Spencer 05.08.2015 / 21:17

Tags