Significado de til no Linux bash (não no diretório inicial)

106

Em primeiro lugar, sei que ~/é o diretório inicial. O CD ~ou ~/leva-me ao diretório inicial.

Porém, cd ~Xme leva a um lugar especial, onde Xparece haver qualquer coisa.

No bash, se eu clicar em " cd ~" e clicar em tab, ele mostrará um monte de ~Xopções possíveis como ~maile ~postgrese ~ssh. Indo para essas pastas e fazendo uma pwdmostra-me que essas pastas não estão no diretório inicial; eles estão por todo o lugar.

Eles não são apelidos. Eu verifiquei. Eles não são env.variáveis, ou então exigiriam um $.

O que é configurar esses links e onde posso encontrar onde eles estão sendo configurados?

jbu
fonte
~ X simplesmente retorna o literal "~ X" mas ~ retorna $ HOME e ~ + retorna $ PWD - eles não são especiais a não ser que buscam variáveis ​​de shell. ou seja, eles não armazenam os valores ou executam um comando para procurá-los. Eles já estão definidos. Você já tentou ~ -? Não consigo pensar em um uso para isso, mas, novamente, ele retorna uma variável de shell $ OLDPWD
SDsolar

Respostas:

71

É um recurso do Bash chamado " expansão de til ". É uma função do shell, não do sistema operacional. Você terá um comportamento diferente com csh, por exemplo.

Para responder à sua pergunta sobre a origem das informações: seu diretório pessoal vem da variável $HOME(não importa o que você armazene lá), enquanto as casas de outros usuários são recuperadas em tempo real usando getpwent(). Essa função geralmente é controlada pelo NSS ; portanto, por padrão, os valores são retirados /etc/passwd, embora possa ser configurado para recuperar as informações usando qualquer fonte desejada, como NIS, LDAP ou um banco de dados SQL.

A expansão do Tilde é mais do que uma pesquisa de diretório inicial. Aqui está um resumo:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirse ~1, ~-1etc., são usados ​​em conjunto com pushde popd.

tylerl
fonte
como uma nota, o fish não suporta nenhum deles, exceto o til simples (~)
por que eles vieram com ~+? parece um tanto inútil.
cregox
3
~ + é quase o mesmo que. No entanto, para usar algo como ./file, ele precisa ir até o sistema de arquivos e descobrir onde. está localizado - leva alguns ciclos. Usar ~ + salva o trabalho, simplesmente retornando o conteúdo da variável shell $ PWD que já está definida conforme você percorre o sistema de arquivos.
SDsolar
32

Esses são os diretórios pessoais dos usuários. Experimente cd ~(your username), por exemplo.

Ana betts
fonte
1
Não são links simbólicos, as contas de serviço não têm diretórios pessoais em / home
Ana Betts,
Melhor resposta no meu caso. Além disso, no meu caso específico, era o diretório / pasta raiz, não a pasta pessoal.
wlwl2
16

Eles são os diretórios pessoais dos usuários em /etc/passwd? Serviços como postgres, sendmail, apache, etc., criam usuários do sistema que têm diretórios pessoais exatamente como os usuários normais.

Sean Bright
fonte
2
Na verdade, eles são ~ nome de usuário é o diretório inicial do usuário especificado
Steve Weet
14

Esses são os usuários. Verifique o seu /etc/passwd.

cd ~username leva você para o diretório inicial do usuário.

Joakim Elofsson
fonte
FTW. Voto positivo. TNX por esclarecer isso. Eu me pergunto quantos ciclos e talvez até mesmo uma subcamada estão envolvidos nisso. Imagine se o seu sistema tiver 3 mil usuários, como em um pequeno ISP. Caramba.
SDsolar
9

Na minha máquina, devido à maneira como as coisas estão configuradas, faço:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

O primeiro presta atenção ao valor da variável de ambiente $HOME; Eu deliberadamente defini meu $HOMEpara um sistema de arquivos local em vez de um sistema de arquivos montado em NFS. O segundo lê o arquivo de senha (aproximadamente; o NIS complica um pouco as coisas) e descobre que o arquivo de senha diz que meu diretório inicial é /u/jlefflere muda para esse diretório.

O irritante é que a maioria dos softwares se comporta como descrito acima (e a especificação POSIX para o shell requer esse comportamento). Eu uso algum software (e não tenho muita escolha sobre como usá-lo) que trata as informações do arquivo de senha como o valor atual de $ HOME, o que está errado.

Aplicando isso à questão - como outros apontaram, ' cd ~x' vai para o diretório inicial do usuário 'x', e mais geralmente, sempre que a expansão do til é feita, ~xsignifica o diretório inicial do usuário 'x' (e é um erro se o usuário 'x' não existir).


Pode valer a pena mencionar que:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

Não consigo encontrar imediatamente um uso para ' ~+', a menos que você faça algumas coisas estranhas ao mover links simbólicos no caminho que leva ao diretório atual.

Você também pode fazer:

cd -

Isso significa o mesmo que ~-.

Jonathan Leffler
fonte
1
Sobre cd ~+: você poderia usá-lo potencialmente para verificar se um diretório em que você está atualmente ainda existe - mesmo que seja uma maneira bem pouco ortodoxa de fazer isso.
professorsloth de
1

Se você estiver usando autofs, a expansão pode realmente vir de /etc/auto.home(ou algo semelhante para sua distribuição). Por exemplo, meu se /etc/auto.masterparece com:

/home2 auto.home --timeout 60

e se /etc/auto.homeparece com:

mgalgs -rw,noquota,intr space:/space/mgalgs
mgalgs
fonte
0

É possível que você esteja vendo usuários OpenDirectory / ActiveDirectory / LDAP "montados automaticamente" em seu diretório inicial.

Em * nix, ~será resolvido para seu diretório inicial. Da mesma forma, ~Xserá resolvido para o 'usuário X'.

Semelhante à montagem automática para diretórios, o OpenDirectory / ActiveDirectory / LDAP é usado em ambientes maiores / corporativos para a montagem automática de diretórios de usuários. Esses usuários podem ser pessoas reais ou podem ser contas de máquina criadas para fornecer vários recursos.

Se você digitar, ~Tabverá uma lista dos usuários em sua máquina.

JS.
fonte