~ é $ HOME, mas às vezes?

13

Esta é uma questão trivial e idiota.

cd ~

faz o mesmo que

cd $HOME

que também é o mesmo que

cd /home/tandu

No entanto,

cd ~not-tandu

muda para /home/not-tandu

Esta é uma escolha puramente sintática? Como isso é tratado pelo kernel (ou o cd execuable?) Existe um caso especial para ~ adicionar a barra se todo o resto for omitido? Isso significa que ~/ e ~ mudam para o mesmo diretório, mas ~a é um diretório para cima. O mesmo não pode ser dito para qualquer outro diretório que você mude.

    
por Explosion Pills 17.03.2012 / 06:17

3 respostas

17

~ é um alias para $HOME fornecido por um número de shells, mas $HOME é mais universal. $HOME realmente pede ao shell para inserir (substituir) a variável ambiental HOME aqui. Há um grande número de diferentes variáveis ambientais que podem ser substituídas, tente executar env para uma lista. Observe que ~ nem sempre é reconhecido quando não está no início de uma palavra. Experimente estes dois comandos para comparação:

ls /~
ls /$HOME

O primeiro é passado para o executável ls como /~ , que tenta então olhar para um arquivo chamado ~ no diretório raiz, o segundo expande $HOME e se torna //home/user , que é então passado para o ls executável como um argumento de linha de comando. Todos os sistemas POSIX (POSIX é o padrão de como os sistemas UNIX e Linux operam) permitem que múltiplas barras sejam tratadas da mesma forma que uma barra, então //home/user é o mesmo que dizer /home/user . ~username é um atalho para dizer ao shell para procurar o nome de usuário no arquivo passwd e retornar seu diretório pessoal. Não há variável de ambiente equivalente. Todas essas substituições são feitas pelo shell e são suportadas pela maioria delas, mas apenas variáveis de ambiente como $HOME têm a garantia de serem suportadas por todos os shells. Além disso, cd é realmente um comando interno. É uma diretiva especial que diz ao próprio shell para alterar os diretórios. Não é como os outros built-ins de shell que podem ser implementados como um executável separado, como echo , porque é usado para alterar um atributo fundamental do processo do shell. echo é meramente um shell integrado por motivos de desempenho, mas nos bons e velhos tempos do UNIX, estava disponível apenas como seu próprio executável /bin/echo .

    
por 17.03.2012 / 14:29
17

~foo significa 'o diretório inicial do usuário foo'.

Isso não é feito pelo kernel, é interpretado pelo shell. Sempre que o shell vê ~foo como um argumento, ele o substitui de maneira transparente pelo diretório home do usuário foo e passa isso para o seu lugar. Portanto, quando você executar cd ~tandu , o shell estará executando cd /home/tandu .

    
por 17.03.2012 / 06:26
5

~ seguido por um nome de usuário se expande para o diretório inicial desse usuário.

    
por 17.03.2012 / 06:26