Sé que esto probablemente se ha preguntado antes, pero no pude encontrarlo con Google.
Dado
- Núcleo de Linux
- No hay configuraciones que cambien $HOME
- golpe
Will ~ == $HOME
ser cierto?
Respuesta aceptada:
Lo que es importante entender es que ~
la expansión es una característica del shell (de algunos shells), no es un carácter mágico que significa su directorio de inicio donde sea que se use.
Está expandido (por el shell, que es una aplicación utilizada para interpretar líneas de comando), como $var
se expande a su valor bajo algunas condiciones cuando se usa en una línea de comando de shell antes de que se ejecute el comando.
Esa función apareció por primera vez en el shell C a fines de la década de 1970 (el shell Bourne no la tenía, ni su predecesor, el shell Thompson), luego se agregó al shell Korn (un shell más nuevo construido sobre el shell Bourne en el años 80). Eventualmente fue estandarizado por POSIX y ahora está disponible en la mayoría de los shells, incluidos los que no son POSIX como fish
.
Debido a que tiene un uso tan generalizado en los shells, algunas aplicaciones que no son shell también lo reconocen como el directorio de inicio. Es el caso de muchas aplicaciones en sus archivos de configuración o propios línea de comando (mutt
, slrn
, vim
…).
bash
específicamente (que es el shell del proyecto GNU y ampliamente utilizado en muchos sistemas operativos basados en Linux), cuando se invoca como sh
, en su mayoría sigue las reglas POSIX sobre ~
expansión, y en áreas no especificadas por POSIX, se comporta principalmente como el shell Korn (del cual es un clon parcial).
Mientras que $var
se expande en la mayoría de los lugares (excepto dentro de comillas simples), ~
la expansión, al ser una ocurrencia tardía, solo se expande en unas pocas condiciones específicas.
Se expande cuando está en su propio argumento en contextos de lista, en contextos donde se espera una cadena.
Aquí hay algunos ejemplos de dónde se expande en bash
:
cmd arg ~ other arg
var=~
var=x:~:x
(requerido por POSIX, usado para variables comoPATH
,MANPATH
…)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(la expansión de~
siendo tomado como patrón en AT&Tksh
pero nobash
desde 4.0).case ~ in ~) ...
${var#~}
(aunque no en otras conchas)cmd foo=~
(aunque no cuando se invoca comosh
, y solo cuando lo que está a la izquierda de=
tiene la forma de unbash
sin comillas nombre de la variable)cmd ~/x
(obviamente requerido por POSIX)cmd ~:x
(pero nox:~:x
ox-~-x
)a[~]=foo; echo "${a[~]} $((a[~]))"
(no en algunas otras conchas)
Aquí hay algunos ejemplos donde no está expandido:
echo "~" '~'
echo [email protected] ~~
(también tenga en cuenta que~u
está destinado a expandirse al directorio de inicio del usuariou
).echo @~
(( HOME == ~ ))
,$(( var + ~ ))
- con
extglob
:case $var in @(~|other))...
(aunquecase $var in ~|other)
está bien). ./configure --prefix=~
(como--prefix
no es un nombre de variable válido)cmd "foo"=~
(enbash
, debido a las comillas).- cuando se invoca como
sh
:export "foo"=~
,env JAVA_HOME=~ cmd
…
En cuanto a lo que se expande:~
solo se expande al contenido de HOME
variable, o cuando no está configurada, al directorio de inicio del usuario actual en la base de datos de la cuenta (como una extensión ya que POSIX deja ese comportamiento sin definir).
Cabe señalar que en ksh88 y bash
versiones anteriores a la 4.0, la expansión de la tilde se globó (generación de nombre de archivo) en contextos de lista:
$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~
Eso no debería ser un problema en los casos habituales.
Tenga en cuenta que debido a que está expandido, se aplica la misma advertencia que otras formas de expansión.
cd ~
No funciona si $HOME
comienza con -
o contiene ..
componentes Entonces, aunque es muy poco probable que alguna vez haga alguna diferencia, estrictamente hablando, uno debe escribir:
cd -P -- ~
O incluso:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(para cubrir los valores de $HOME
como -
, +2
…) o simplemente:
cd
(como cd
lo lleva a su directorio de inicio sin ningún argumento)
Otros shells tienen ~
más avanzados expansiones Por ejemplo, en zsh
, tenemos:
~4
,~-
,~-2
(con finalización) utilizado para expandir los directorios en su pila de directorios (los lugares donde hacd
antes).- directorios dinámicos con nombre . Puedes definir tu propio mecanismo para decidir cómo
~something
se está ampliando.