GNU/Linux >> Tutoriales Linux >  >> Linux

¿Entiendes el significado de `$_`?

¿Podría explicar las siguientes oraciones del manual de Bash sobre $_? , especialmente las partes en negrita, ¿tal vez con algunos ejemplos?

  1. Al iniciar el shell, establezca la ruta de acceso absoluta utilizada para
    invocar el shell o el script de shell que se está ejecutando como pasado en el entorno
    o lista de argumentos
    .

  2. Posteriormente , se expande hasta el último argumento del comando anterior
    , después de la expansión.

  3. También establezca la ruta de acceso completa utilizada para invocar cada
    comando ejecutado
    y colocado en el entorno exportado a ese comando .

  4. Al revisar el correo , este parámetro contiene el nombre del archivo de correo.

Respuesta aceptada:

Estoy de acuerdo en que no está muy claro.

1. Al iniciar el shell,

  • si el _ variable estaba en el entorno que bash recibido , luego bash lo deja intacto.

    En particular, si ese bash Shell fue invocado por otro bash shell (aunque zsh , yash y algo de ksh las implementaciones también lo hacen
    ), entonces eso bash shell habrá establecido el _ variable de entorno
    a la ruta del comando que se está ejecutando (ese es el tercer punto
    en su pregunta). Por ejemplo, si bash se invoca para
    interpretar un script como resultado de otro bash intérprete de shell:

    bash-script some args
    

    Ese bash habrá pasado _=/path/to/bash-scrip en el entorno
    dado a bash-script , y ese es el valor inicial
    del $_ bash la variable estará en el bash shell que
    interpreta ese script.

    $ env -i _=whatever bash -c 'echo "$_"'
    whatever
    
  • Ahora, si la aplicación que invoca no pasa un _ entorno
    variable
    , el bash invocado shell inicializará $_ al argv[0] se recibe
    a sí mismo, lo que podría ser bash , o /path/to/bash o /path/to/some-script o cualquier otra cosa (en el ejemplo anterior, eso
    sería /bin/bash si el she-bang del guión fuera #! /bin/bash o /path/to/bash-script dependiendo del
    sistema).

    Entonces, ese texto es engañoso, ya que describe el comportamiento de la persona que llama
    que bash no tiene control sobre. La aplicación que invocó bash es muy posible que no establezca $_ en absoluto (en la práctica, solo algunos
    shells y algunas aplicaciones interactivas raras lo hacen, execlp() no
    por ejemplo), o podría usarlo para algo completamente diferente
    (por ejemplo, ksh93 lo establece en *pid*/path/to/command ).

    $ env bash -c 'echo "$_"'
    /usr/bin/env   (env did not set it to /bin/bash, so the value we
                   get is the one passed to env by my interactive shell)
    $ ksh93 -c 'bash -c "echo $_"'
    *20042*/bin/bash
    

2. Posteriormente

El Posteriormente tampoco es muy claro. En la práctica, eso es tan pronto como bash interpreta un comando simple en el entorno de shell actual.

  • En el caso de un shell interactivo , que estará en el primer comando simple interpretado desde /etc/bash.bashrc por ejemplo.

    Por ejemplo, en el indicador de un shell interactivo:

     $ echo "$_"
     ]      (the last arg of the last command from my ~/.bashrc)
     $ f() { echo test; }
     $ echo "$_"
     ]      (the command-line before had no simple command, so we get
             the last argument of that previous echo commandline)
     $ (: test)
     $ echo "$_"
     ]      (simple command, but in a sub-shell environment)
     $ : test
     $ echo "$_"
     test
    
  • Para un shell no interactivo , sería el primer comando en $BASH_ENV o del código alimentado a ese shell si $BASH_ENV no está
    configurado.

Relacionado:¿Diferencia entre las aplicaciones GTK y QT?

3. Cuando Bash ejecuta un comando

El tercer punto es algo diferente y se insinúa en la discusión anterior.

bash , como algunos otros shells pasarán un _ variable de entorno a los comandos que ejecuta que contiene la ruta que bash utilizado como el primer argumento del execve() llamadas al sistema.

$ env | grep '^_'
_=/usr/bin/env

4. Al revisar el correo

El cuarto punto se describe con más detalle en la descripción del MAILPATH variables:

'RUTA DE CORREO'

Una lista separada por dos puntos de nombres de archivo que el shell periódicamente
comprueba si hay correo nuevo
.

Cada entrada de la lista puede especificar el mensaje que
se imprime cuando llega correo nuevo en el archivo de correo
separando el
nombre de archivo del mensaje con un '?'.
Cuando se usa en el texto del
mensaje, '$_' se expande al nombre del archivo de correo actual.

Ejemplo:

$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>

Linux
  1. ¿Navegación rápida de directorios en Bash Shell?

  2. El Bash'?

  3. Personalización de Bash Shell:Negrita/color ¿El comando?

  4. ¿El significado de $? ¿En un guión de Shell?

  5. ¿Cuál es el significado de POSIX?

.bashrc frente a .bash_profile

¿Qué es el Shell en Linux?

Comando Bash fc:maneja fácilmente el Bash Shell como un profesional

Cómo BASH Shell carga sus archivos de configuración en Linux

¿Cuál es la diferencia entre &> y >&en bash?

¿Cómo uso los comandos watch y jobs juntos en Bash?