Por que o cd ~ k (& tab) se expande para o cd ~ kernoops quando eu já tenho uma pasta chamada “~ kernel-ppa” no pwd?

8

Eu tenho uma pasta chamada ~kernel-ppa dentro de ~/Downloads .

aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa

Agora, quando digito cd ~k e pressiono a tecla Tab para expansão automática, o shell expande para cd ~kernoops/ em vez de cd ~kernel-ppa/ , embora a pasta com os mesmos caracteres iniciais já esteja presente.

Para a expansão automática funcionar, preciso escapar com \ . Assim, usar cd \~k e pressionar a tecla Tab corretamente a expande para cd \~kernel-ppa/ . Mesmo usando cd \ e pressionando a tecla Tab faz o truque.

Por que é assim e por que eu preciso escapar? Além disso, o que estou escapando, pois mesmo ~ não é necessário para expansão automática?

Se eu for com o fluxo e executar 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?

    
por Aditya 02.04.2014 / 15:30

2 respostas

10

Como você sabe, ~ se expande para o seu diretório pessoal. Mas o que você parece ter perdido é que ~john se expande para o diretório home do usuário chamado "john".

Verifique seu arquivo /etc/passwd :

% grep ker /etc/passwd
kernoops:x:107:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

Tem um "usuário do sistema" chamado kernoops (por razões internas de relatório de erros). Então quando você digita cd ~k Tab o shell dá preferência (1) à expansão do nome de usuário antes da expansão dos diretórios locais, e você tem cd ~kernoops . Agora resulta que o usuário "kernoops" home dir é / , então cd s para ele.

No meu shell, zsh , não tenho barra dupla (2):

[:/] % cd ~kernoops/ 
[:/] % pwd
/
[:/] % cd //
[:/] % pwd
/

Como um aparte, esse nome de diretório não é bem pensado. Ele precisará de três cuidados em scripts e qualquer outra coisa. A única pior ideia que posso imaginar é incorporar uma guia ...

Notas de rodapé:

(1) Em zsh , mesmo se eu tiver um diretório chamado ~xdir e nenhum usuário começar com x ; fazer cd ~x Tab não expande e nem citar o ~ dá erro:

[:~/tmp/x] %  mkdir \~xdir
[:~/tmp/x] % ls
~xdir
[:~/tmp/x] % cd ~xdir  
zsh: no such user or named directory: xdir
[:~/tmp/x] 1 % 

(2) Eu pareço lembrar que posix fez uma exceção para o // inicial em um caminho --- ele deve ser mantido porque alguma variante antiga do unix (eu usei o apollos com o Domain / OS que o possuía) usava //machine-name/... para acessar facilmente o sistema de arquivos de outras máquinas na rede local (a segurança ainda não havia sido inventada). Então, provavelmente, o bash está bem aqui. Se você fizer cd /// , você terá o% normal/ em ambos os shell.

Sim, encontrado em unix.se !

    
por Rmano 02.04.2014 / 16:03
7

O caractere til ( ~ ) tem um significado especial no shell. Quando é visto em qualquer comando, é expandido para o nome do seu diretório pessoal. Fazer cd ~ ou cd /home/aditya é o mesmo, acaba no seu diretório pessoal.

Ao colocar um caractere de barra invertida ( \ ) na frente do til, você diz ao shell para não fazer a expansão do caractere especial a seguir (isso é o que é chamado de shell escape). Ao fazer cd \~ , você pede ao shell para ir para um diretório chamado ~ que estaria localizado no diretório em que você está executando o comando. Então, fazer cd \~kernel-ppa irá mudar você para o diretório chamado ~kernel-ppa , que é o comportamento normal.

EDITADO: mais em ~

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 expansão de Tab após cd ~ expandirá para nomes de usuário existentes em seu sistema. Se a conclusão de Tab após cd ~k , for expandida para ~ kernoops porque existe um usuário chamado kernoops no usuário do sistema, com um diretório inicial de / . Como a expansão de cd ~k resulta em cd ~kernoops/ com uma barra final e o diretório inicial sendo / , você é movido para // . Mas isso é estritamente o mesmo que / como alguns já disseram antes.

    
por Benoit 02.04.2014 / 15:54