~
é 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
.