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 cd
executá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 ~a
existe um diretório acima. O mesmo não pode ser dito para qualquer outro diretório para o qual você mudar.
cd-command
home
Comprimidos de explosão
fonte
fonte
cd
sem parâmetros funciona comocd ~
. Se você substituircd
comecho
você pode ver o que a expressão é expandida pelo shell.Respostas:
~
é 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 executarenv
uma lista. Observe que~
nem sempre é reconhecido quando não está no início de uma palavra. Experimente estes dois comandos para comparação: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, comoecho
é 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
.fonte
~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ê
~foo
como argumento, ele o substitui de forma transparente pelo diretório inicial do usuáriofoo
e passa o mesmo em seu lugar. Portanto, quando você executacd ~tandu
, o shell está realmente em execuçãocd /home/tandu
.fonte
cd
ou 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?cd
, não é executável externo para fazê-lo (não seria possível)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/sh
não grocava~
.~
seguido de um nome de usuário se expande para o diretório inicial desse usuário.fonte