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 $HOME
var ou fazer dois cd
s. 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/download
para ir para o diretório de download de um usuário.
Fazendo cd
é basicamente chamando cd
sem argumentos e de acordo com cd
o 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 cd
comando, 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, HOME
a 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 cd
fará 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 HOME
quebrar, cd
mas ~
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 HOME
cadeias vazias quebra o cd
comportamento e o comportamento.
Tilde e $HOME
tem 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 HOME
foi respondida nesta pergunta : uma vez o caractere til compartilhou a mesma chave HOME
no terminal Lear-Siegler ADM-3A. HOME
por 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 HOME
ser 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 echo
gera 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 HOME
afeta ~
:
$ 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 PWD
e HOME
permanecemos 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
, dash
E csh
- todos se comportam mesma com cd
ou 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 cd
e 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 $HOME
digitar um cd
comando. 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.
root
O diretório pessoal do Eg geralmente está fora de campo/home
cd ~
vscd $HOME
vscd ~not-tandu
. Esta questão está perguntando sobrecd
vscd ~
.