~
é um alias $HOME
fornecido por várias conchas, mas $HOME
é mais universal. $HOME
realmente pede ao shell para inserir (substituir) a variável ambiental HOME aqui. Há várias variáveis ambientais diferentes que podem ser substituídas. Tente executar env
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 tenta procurar um arquivo chamado ~
no diretório raiz, o segundo se expande $HOME
e se torna o //home/user
qual é passado para o executável ls como um argumento da linha de comando. Todos os sistemas POSIX (POSIX é o padrão para o funcionamento dos sistemas UNIX e Linux) permitem que várias barras sejam tratadas da mesma forma que uma barra, assim //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
essas são garantidas por todas as shells. Além disso,cd
é realmente um comando interno. É uma diretiva especial que diz ao próprio shell para mudar de diretório. Não é como os outros built-ins do 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 embutido por motivos de desempenho, mas nos bons e velhos tempos do UNIX, estava disponível apenas como seu próprio executável /bin/echo
.