~ é $HOME, mas às vezes?

~ é $HOME, mas às vezes?

disco ~

faz a mesma coisa que

cd $HOME

que também é o mesmo que

cd /home/tandu

No entanto,

cd ~not-tandu

muda para/home/not-tandu

Isso é puramente uma escolha sintática? Como isso é tratado pelo kernel (ou pelo cdexecutável?) Existe um caso especial para ~adicionar a barra se todo o resto for omitido? Ou seja, ~/e ~mude para o mesmo diretório, mas ~acom um diretório acima. O mesmo não pode ser dito de qualquer outro diretório para o qual você mudar.

Responder1

~é um apelido $HOMEfornecido por vários shells, mas $HOMEé mais universal. $HOMEna verdade, pede ao shell para inserir (substituir) a variável ambiental HOME aqui. Há um grande número de variáveis ​​ambientais diferentes que podem ser substituídas, tente concorrer envpara obter 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, /~que então tenta examinar um arquivo chamado ~no diretório raiz, o segundo se expande $HOMEe se torna //home/usero que é então passado para o executável ls como um argumento de linha de comando. Todos os sistemas POSIX (POSIX é o padrão de operação dos sistemas UNIX e Linux) permitem que várias barras sejam tratadas da mesma forma que uma barra, portanto //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 inicial. 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 $HOMEtêm garantia de suporte por todos os shells. Além disso, cdé na verdade um comando integrado. É uma diretiva especial que diz ao próprio shell para alterar os diretórios. Não é como outros shell integrados que podem ser implementados como um executável separado echoporque é usado para alterar um atributo fundamental do processo do shell. echoé apenas um shell embutido por motivos de desempenho, mas nos bons e velhos tempos do UNIX, só estava disponível como seu próprio executável /bin/echo.

Responder2

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

Isso não é feito pelo kernel, é interpretado pelo shell. Sempre que o shell vê ~foocomo um argumento, ele o substitui de forma transparente pelo diretório inicial do usuário fooe o passa em seu lugar. Então, quando você executa cd ~tandu, o shell está realmente em execução cd /home/tandu.

Responder3

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

informação relacionada