~é um alias $HOMEfornecido por várias conchas, mas $HOMEé mais universal. $HOMErealmente 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 envuma 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 $HOMEe se torna o //home/userqual é 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 $HOMEessas 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.