Diferença entre 'cd' e 'cd ~'

10

Gostaria de saber se o cd sozinho me envia para minha pasta pessoal e o cd ~ faz o mesmo, por que o ~ foi adicionado em primeiro lugar?

É algo específico para o BASH ou eles se comportariam de maneira diferente em outro Shell?

Luis Alvarado
fonte
2
Definitivamente não é uma duplicata. Essa pergunta está perguntando sobre cd ~vs cd $HOMEvs cd ~not-tandu. Esta questão está perguntando sobre cdvs cd ~.

Respostas:

17

O ~pode ser usado para mais do que apenas isso. Qualquer comando pode lucrar com um atalho para a pasta pessoal. Portanto, não é necessário se você deseja entrar em casa, mas e quanto ~/.config?

$ cd ~/.config

Caso contrário, você teria que escrever o caminho inicial, usar o $HOMEvar ou fazer dois cds. Também para copiar ou mover arquivos:

$ cp ~/downloads/some-file some/path/

Como a maioria dos arquivos está em casa, é sempre bom ter um atalho.

ahilsend
fonte
Oi ahilsend, na verdade, minha pergunta é mais orientada para o porquê das 2 maneiras. Eu já sei sobre ~ usar a variável $ HOME, mas, com isso em mente, por que o "CD" sozinho também me envia para casa. Por que 2 maneiras para o mesmo propósito?
18743 Luis Alvarado
4
@CYREX Meu palpite seria salvar a digitação no caso muito comum de querer mudar para o diretório inicial.
um CVn 27/07/2013
1
O outro uso do ~é fazer cd ~user/downloadpara ir para o diretório de download de um usuário.
1--15
5

Fazendo cd é basicamente chamando cdsem argumentos e de acordo com cdo comportamento "... se dir não for fornecido, o valor da variável HOME shell é o padrão." (do manual do bash ). Por outro lado, cd ~é quando você fornece um argumento ao cdcomando, o que acontece ~e o shell executará a expansão do til . No que diz respeito ao diretório inicial do usuário - não há diferença. Nos dois casos, HOMEa variável de ambiente será consultada:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

Efetivamente, isso também não tem diferença de cd $HOME. No entanto, enquanto cdfará uma única coisa, o til pode ser usado para executar outras expansões, como ~+no diretório de trabalho atual.

No entanto, curiosamente, podemos unset HOMEquebrar, cdmas ~ainda funcionará:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Por quê ? Mais uma vez, responda no manual:

Se HOME estiver desabilitado, o diretório inicial do usuário que está executando o shell será substituído. Caso contrário, o prefixo til será substituído pelo diretório inicial associado ao nome de login especificado.

Observe que a desarmação é diferente da variável vazia HOME=e tem efeito. A documentação fala especificamente sobre a variável não configurada. Tornar variável igual a string vazia tem efeito oposto ao que esperávamos:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Aqui você pode ver que criar HOMEcadeias vazias quebra o cdcomportamento e o comportamento.


Tilde e $HOMEtem um pouco de diferença e razão de existência diferente. $HOMEé uma variável do shell, que também por coincidência é uma das variáveis ​​de ambiente - e está disponível para todos os programas; em C você usaria environ()para acessar isso. Por outro lado, tildeé a sintaxe específica do shell que executa a expansão de til, embora você possa usar a wordexp()função para executar a expansão semelhante ao shell ( referência ) em C também.

A razão pela qual ~representa HOMEfoi respondida nesta pergunta : uma vez o caractere til compartilhou a mesma chave HOMEno terminal Lear-Siegler ADM-3A. HOMEpor outro lado, é uma variável de ambiente que tinha significado puramente simbólico e nenhuma representação física.

Além disso, o fato de HOMEser uma variável de ambiente nos permite desmarcá-la, onde, como não podemos definir ~outra coisa por meios simples.

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

Observe a linha em branco onde primeiro echogera a variável não definida e o fato disso. Por outro lado, não podemos fazer coisas desse tipo:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

No entanto, alterar HOMEafeta ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Além disso, como ~também funciona como caractere de expansão, podemos fazer coisas assim para mostrar o diretório de trabalho atual:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Enquanto que, se queremos fazer isso por meio de variáveis ​​de ambiente, precisamos PWDe HOMEpermanecemos os mesmos, ou se você fizer coisas como echo $HOME+- isso é apenas concatenação de cadeias / variáveis. Mas, novamente, ~+retira informações das variáveis ​​de ambiente:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

NOTA : as expansões ~+e ~-funcionam ksh, mas não dentro dash.


Para responder a algumas de suas perguntas específicas:

É algo específico para o BASH ou eles se comportariam de maneira diferente em outro Shell?

Não, esse deve ser um comportamento consistente. ksh, dashE csh- todos se comportam mesma com cdou cd ~.

Por que o ~ foi adicionado em primeiro lugar?

Eu diria conveniência e razões históricas, conforme explicado na resposta vinculada sobre til. Eventualmente, cresceu para executar mais do que apenas expansão do diretório inicial.

Sergiy Kolodyazhnyy
fonte
0

Independentemente se você está vários níveis de pastas acima ou abaixo $HOME, os comandos cde cd ~fazer a mesma coisa e não diferem - ele vai mandar de volta para o seu diretório HOME.

NO ENTANTO: Quando você está 1 ou mais níveis de pasta acima de HOME e deseja ir DIRETAMENTE para um subdiretório 1 ou mais níveis de pasta abaixo $HOME, o til ( ~) é útil ao salvar as teclas pressionadas quando usado para substituir o texto necessário para consultar ao $HOMEdigitar um cdcomando. Por exemplo;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
P Alexander
fonte
0

~ significa / home / local do nome de usuário, para economizar tempo ao digitar. Por exemplo, cd / home / nome de usuário / Downloads é o mesmo que cd ~ / Downloads, mas menos digitação. Ambos os comandos fazem o mesmo, altere o diretório de trabalho para esse local.

Ionut
fonte
Na verdade não. rootO diretório pessoal do Eg geralmente está fora de campo/home
Dmitry Grigoryev