Eu tenho uma pasta chamada ~kernel-ppa
dentro ~/Downloads
.
aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa
Agora, quando digito cd ~k
e pressiono Tabpara expansão automática, o shell o expande para, em cd ~kernoops/
vez de, cd ~kernel-ppa/
embora a pasta com os mesmos caracteres iniciais já esteja presente.
Para que a expansão automática funcione, preciso escapar dela \
. Assim, usar cd \~k
e pressionar Tabcorretamente o expande para cd \~kernel-ppa/
. Mesmo usando cd \
e pressionando Tabfaz o truque.
Por que é assim e por que preciso escapar? Além disso, do que estou escapando, já que nem ~
é necessário para a expansão automática?
Se eu for com o fluxo, correr cd ~kernoops/
e pressionar Enter, o status do terminal mudará para //
:
aditya@aditya-desktop:~/Downloads$ cd ~kernoops/
aditya@aditya-desktop://$ pwd
//
aditya@aditya-desktop://$ ls
bin cdrom etc initrd.img lost+found mnt proc run srv tmp var
boot dev home lib media opt root sbin sys usr vmlinuz
aditya@aditya-desktop://$
Parece o /
diretório, mas pwd
diz que é //
. O que exatamente é isso?
command-line
bash
Aditya
fonte
fonte
tree
ou comls
e você notará que essa é a primeira subpasta.~kernel-ppa
é a única pasta dentro dela; se eu apenas executarcd
e pressionar tab, ele se expandirá paracd \~kernel-ppa/
. Eu não preciso fugir também!Respostas:
Como você sabe,
~
expande para o diretório inicial. Mas o que você parece ter perdido é que se~john
expande para o diretório inicial do usuário chamado "john".Verifique seu
/etc/passwd
arquivo:Ele tem um "usuário do sistema" nomeado
kernoops
(por motivos de relatórios internos de erros). Portanto, quando você digita,cd ~k
Tabo shell dá preferência (1) à expansão do nome do usuário antes da expansão dos diretórios locais, e você temcd ~kernoops
. Agora resulta que o diretório inicial do usuário "kernoops" é/
, portantocd
é isso.No meu shell,
zsh
não tenho barra dupla (2):Como um aparte, este nome de diretório não é bem pensado. Será necessário um triplo cuidado nos scripts e o que for. A única pior ideia que posso pensar é incorporar uma guia nela ...
Notas de rodapé:
(1) In
zsh
, mesmo que eu tenha um diretório nomeado~xdir
e nenhum usuário inicie comx
; fazercd ~x
Tabnão se expande e não cita o~
erro da:(2) Parece que me lembro que o posix fez uma exceção para a inicial
//
em um caminho - deve ser mantido porque alguma variante antiga do unix (usei os apollos com o Domain / OS que possuía) costumava//machine-name/...
acessar sem interrupção outras máquinas ' sistema de arquivos na rede local (a segurança ainda não foi inventada). Então provavelmente o bash está bem aqui. Se vocêcd ///
tiver o normal/
no shell, no entanto.Sim, encontrado no unix.se !
fonte
O caractere til (
~
) tem um significado especial no shell. Quando é visto em qualquer comando, é expandido para o nome do diretório inicial. Fazendocd ~
oucd /home/aditya
é o mesmo, ele acaba no seu diretório pessoal.Ao colocar um caractere de barra invertida (
\
) na frente do til, você instrui o shell a não fazer a expansão do seguinte caractere especial (isso é chamado de escape do shell). Ao fazer isso,cd \~
você solicita que o shell mude para um diretório chamado~
que estaria localizado no diretório em que você está executando o comando. Assimcd \~kernel-ppa
, você mudará para o diretório chamado~kernel-ppa
, que é o comportamento normal.EDITADO: mais sobre ~
Se você escrever um nome de usuário do seu sistema após o
~
, você será movido para o diretório inicial desse usuário. Fazer uma Tabexpansão depoiscd ~
será expandido para nomes de usuários existentes no seu sistema. Se Tabconcluir depoiscd ~k
, ele será expandido para ~ kernoops porque existe um usuário chamado kernoops no usuário do sistema, com um diretório inicial de/
. À medida que a expansão doscd ~k
resultados ocorrecd ~kernoops/
com uma barra à direita e o diretório inicial sendo ativado/
, você é movido para//
. Mas isso é estritamente o mesmo/
que outras pessoas já disseram anteriormente.fonte