Diferença entre quase os mesmos comandos de diretório

2

Existe alguma diferença entre esses (quase os mesmos) comandos de diretório?

1. cd
2. cd ~
3. cd ~/

Eu tentei no meu shell, e todos eles levam ao diretório inicial. Existe algum cenário possível em que eles são diferentes?

    
por Belmark Caday 20.05.2013 / 11:03

2 respostas

9

POSIX define isso ...

  1. ... se cd não recebeu nenhum argumento, ele usará o valor de $HOME se a variável estiver configurada e não fará nada de outra forma (embora também diga que os resultados não são especificados). - cd

  2. ... se um argumento for ~ ou começar com ~/ , o til será expandido para o valor de $HOME se a variável for definida; os resultados não são especificados de outra forma. - tilde expansion

Então, se $HOME estiver definido, então todos os três comandos serão equivalentes. (barras extras após nomes de diretório não fazem sentido).

No entanto, se $HOME não for definido, os resultados de ~ -expansion e cd serão não especificados :

  • Em bash , AT & T ksh , e Heirloom sh ,% comumcd falhará com "nenhum diretório inicial ".

  • Em csh , zsh , traço e MirBSD mksh , simples cd será não faça nada.

  • Em tcsh ,% comumcd procurará o diretório inicial usando getpwuid() .

Quanto à expansão ~ ...

  • bash e tcsh expandirão ~ para o diretório inicial em getpwnam() .

  • AT & T ksh expandirá ~ para seu nome de usuário (?!).

  • Em csh e zsh , ~ será expandido para uma string vazia. ( cd ~ , portanto, não fará nada, como cd , nesses shells.)

  • No traço e no MirBSD mksh , o ~ permanecerá literal ~ . (O uso de cd ~ tentará mudar para um diretório chamado tal).

  • A herança sh nunca expande ~ mesmo se $HOME estiver definido - provavelmente é anterior à convenção.

Destes, apenas csh e zsh aderem à definição POSIX de expandir ~ para o valor de $HOME , mesmo que esteja vazio.

(O shell fish sempre define $HOME de getpwnam() na inicialização se a variável estiver vazia e se recusa a modificá-la posteriormente.)

    
por 20.05.2013 / 11:12
0

Bem, posso imaginar um cenário em que 1 seja diferente de 2 e 3. Tente definir a seguinte função no bash:

cd () { if (($#)) ; then builtin cd "$1" ; else cd / ; fi ; }
  1. levará você para / , enquanto 2. e 3. o levarão para casa.
por 20.05.2013 / 11:09