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