~ é $ HOME, mas às vezes?

14

cd ~

faz a mesma coisa que

cd $HOME

que também é o mesmo que

cd /home/tandu

Contudo,

cd ~not-tandu

muda para /home/not-tandu

Esta é uma escolha puramente sintática? Como isso é tratado pelo kernel (ou pelo cdexecutá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 ~aexiste um diretório acima. O mesmo não pode ser dito para qualquer outro diretório para o qual você mudar.

Comprimidos de explosão
fonte
3
Sinta-se à vontade para comparar ~ não-tandu e ~ / não-tandu, um aponta para o diretório inicial do usuário não-tandu e o outro aponta para o diretório não-tandu em sua casa.
21412 Johan Johan
4
Não é o kernel ou o "cd executável" (já que não existe) - é um shell embutido.
Paul Tomblin
Desde que você não mencionou: cdsem parâmetros funciona como cd ~. Se você substituir cdcom echovocê pode ver o que a expressão é expandida pelo shell.
Jofel

Respostas:

18

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

penguin359
fonte
re ", que tenta procurar um arquivo chamado ~ no diretório raiz"; Isso é para todos os sabores unix?
Pacerier 25/05/19
17

~foo significa 'o diretório inicial do usuário foo'.

Isso não é feito pelo kernel, é interpretado pelo shell. Sempre que o shell o vê ~foocomo argumento, ele o substitui de forma transparente pelo diretório inicial do usuário fooe passa o mesmo em seu lugar. Portanto, quando você executa cd ~tandu, o shell está realmente em execução cd /home/tandu.

Patrick
fonte
1
O que especificamente faz essa substituição e com qual algoritmo? É cdou a concha? E se você não estiver executando um shell? É simples "se ~ for seguido por algo, expandir de forma diferente?" ou existe algum outro tratamento especial para essa condição única?
Explosion Pills
8
Veja o manual do Bash sobre Expansão Tilde . (Muitas outras conchas e programas seguem regras semelhantes.)
CJM
4
@tandu: o shell faz cd, não é executável externo para fazê-lo (não seria possível)
Mat
1
@ tandu: se você não está executando um shell (por exemplo, tentando fazer isso usando exec(2)), a expansão do shell não ocorre. Sem a expansão do shell, ~não é substituído por nada - é apenas outro personagem perfeitamente válido. Isso me mordeu nos meus primeiros dias no SunOS porque /bin/shnão grocava ~.
Alexios #
5

~ seguido de um nome de usuário se expande para o diretório inicial desse usuário.

Ignacio Vazquez-Abrams
fonte