
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 cd
executá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 ~a
com um diretório acima. O mesmo não pode ser dito de qualquer outro diretório para o qual você mudar.
Responder1
~
é um apelido $HOME
fornecido por vários shells, mas $HOME
é mais universal. $HOME
na 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 env
para 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 $HOME
e se torna //home/user
o 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 $HOME
tê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 echo
porque é 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
~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 forma transparente pelo diretório inicial do usuário foo
e 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.