$HOME
e ~
geralmente se referem à mesma coisa. Ou seja, eles são o caminho para o diretório "home do usuário", que tem a forma geral "/ home / userName".
Quando, se alguma vez, eles não se referem ao mesmo diretório?
$HOME
e ~
geralmente se referem à mesma coisa. Ou seja, eles são o caminho para o diretório "home do usuário", que tem a forma geral "/ home / userName".
Quando, se alguma vez, eles não se referem ao mesmo diretório?
Respostas:
Ambos $HOME
e ~
apontam para a mesma pasta, pasta pessoal do usuário atual, mas ambos são coisas muito diferentes.
$HOME
é uma variável de ambiente , definida para conter a pasta inicial do usuário atual.~
é um símbolo de expansão do shell , ou seja, um dos símbolos processados antes do comando real ser executado. ~
sozinho expande para o valor de $ HOME. ~nemo
expande para o diretório inicial do usuário nemo
. Um símbolo de expansão do shell é um caractere (ou par de caracteres) que é processado / interpretado pelo shell para criar o comando real. Outro exemplo de símbolo de expansão de shell *
é usado para expandir nomes de arquivos.~
expande para $ HOME ou% APPDATA% no Windows. Se eles não estiverem definidos, procurará o caminho "no banco de dados de senhas" (o que geralmente significa /etc/passwd
, mas pode ser LDAP ou alguma outra fonte de dados). Cerca de 20 anos atrás, você poderia ter sido avisado de que o $ HOME talvez não estivesse definido em algumas máquinas, enquanto a ~
garantia de expandir para algo.
~
expande para $HOME
(igual a $HOMEPATH
), não $APPDATA
. E no cmd.exe, ~
não se expande.
HOME
é uma variável de ambiente (um conceito OS, em sh conchas por exemplo conjunto com export
ou declare -x
), não uma variável de shell (definição de que depende inteiramente de shell, mas em sh conchas é geralmente definido com foo=value
ou com set
ou em alguns outros maneiras).
Uma maneira de diferir é a forma como o shell Bash os converte quando colocados "
entre aspas.
Se você usar echo
desta maneira, sem aspas, ~
e $HOME
terá o mesmo efeito:
$ echo ~
/home/elias
$ echo $HOME
/home/elias
No entanto, entre "
aspas, o resultado difere:
$ echo "~"
~
$ echo "$HOME"
/home/elias
~
só se expande como parte de um prefixo de til que, por definição, deve começar no início da palavra. Além disso, como fazia parte dos padrões de globbing, ~
não funcionará entre aspas duplas. Portanto, "~"
ou a~b
resultará em um valor literal de ~
preservação.
Um único ~
(ou um ~
seguido de a /
) será expandido para a página inicial do usuário atual:
$ echo ~/.ssh
/home/user/.ssh
Um ~
seguido por um nome de usuário será expandido para a pasta inicial desse usuário:
$ echo ~root/.ssh
/root/.ssh
A ~
seguido de a +
ou a -
e um número opcional serão expandidos para elementos da pilha de diretórios :
$ cd /etc
$ echo ~+0
/etc
$HOME
é o equivalente a um único ~
, que segue regras de sintaxe para variáveis. Por exemplo, ele se expande entre aspas duplas, pode ser desconfigurado e operandos de manipulação de string podem ser aplicados a ele.
Isso depende muito do que faz a expansão. No bash, ~
é uma maneira conveniente de obter o diretório inicial sem acionar a expansão do arquivo ou a divisão de palavras, mesmo que não esteja entre aspas. Por exemplo:
$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*
Ou:
$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|
Portanto, se você estiver lutando com aspas por algum motivo (nesse caso, você realmente deve repensar a coisa toda, é mais fácil lutar com porcos), ~
pode ser mais conveniente.
Em outros lugares, em Python, por exemplo, ~
e $HOME
precisa ser expandido por diferentes funções . Alguns outros lugares permitem variáveis e não permitem outras sintaxes de shell, como curingas ou expansão de til (por exemplo ~/.pam_environment
, que possui uma sintaxe especial para expansão de variáveis). Outros lugares ainda permitem a expansão do til como uma exceção (por exemplo, systemd ), mas consultam o banco de dados passwd diretamente em vez de usar $HOME
.
$HOME
, mas não pode (diretamente) alterar o valor de ~
.
$HOME
e ~
não se referir à mesma coisa - normalmente, por padrão - e, em seguida, você atribui deliberadamente à variável de ambiente para fazê-la não se referir à mesma coisa. Esta é uma boa demonstração, mas desnecessariamente confusa.
É mais provável que $ HOME / funcione no padrão POSIX.2 Bourne / bin / sh, pois a expansão til é uma extensão encontrada no BSD csh tcsh GNU bash e outros.
Se você deseja gravar scripts portáteis no busybox, dash ou BSD sh, invista nas letras extras para não bater com ~ /: Esse arquivo ou diretório não existe em determinados sistemas.
Também acho $ HOME / mais legível.
$HOME
e raramente usam ~
. Meu antigo eu provavelmente sabia disso.
~
shell é dependente, enquanto $ HOME não.