GNU/Linux >> Tutoriales Linux >  >> Linux

~ Siempre es igual a $home?

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 como PATH , MANPATH …)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]] (la expansión de ~ siendo tomado como patrón en AT&T ksh pero no bash desde 4.0).
  • case ~ in ~) ...
  • ${var#~} (aunque no en otras conchas)
  • cmd foo=~ (aunque no cuando se invoca como sh , y solo cuando lo que está a la izquierda de = tiene la forma de un bash sin comillas nombre de la variable)
  • cmd ~/x (obviamente requerido por POSIX)
  • cmd ~:x (pero no x:~:x o x-~-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 usuario u ).
  • echo @~
  • (( HOME == ~ )) , $(( var + ~ ))
  • con extglob :case $var in @(~|other))... (aunque case $var in ~|other) está bien).
  • ./configure --prefix=~ (como --prefix no es un nombre de variable válido)
  • cmd "foo"=~ (en bash , debido a las comillas).
  • cuando se invoca como sh :export "foo"=~ , env JAVA_HOME=~ cmd
Relacionado:Debian – ¿Misterioso “no se puede resolver el host” en dead.letter?

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 ha cd antes).
  • directorios dinámicos con nombre . Puedes definir tu propio mecanismo para decidir cómo ~something se está ampliando.

Linux
  1. ¿Qué hace 'exec {fd}/watchdog' en Bash?

  2. ¿The Bash Star * Wildcard siempre produce una lista ordenada (ascendente)?

  3. ¿Cómo funciona cat << EOF en bash?

  4. ¿Qué hace 'bash -c'?

  5. ¿Por qué Ctrl + V no se pega en Bash (shell de Linux)?

Cómo comparar cadenas en Bash

Bash Shebang

¿Qué significa set -e en un script bash?

El indicador de bash de Docker no muestra la salida de color

La coincidencia de patrones no funciona en el script bash

¿Cómo prueba bash 'falso'?