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?
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?
Respostas:
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.
~é fazer cd ~user/downloadpara ir para o diretório de download de um usuário.
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.
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
~ 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.
rootO diretório pessoal do Eg geralmente está fora de campo/home
cd ~vscd $HOMEvscd ~not-tandu. Esta questão está perguntando sobrecdvscd ~.