GNU/Linux >> Tutoriales Linux >  >> Linux

Esta sintaxis de Shell/bash:Somevariable=somevalue Somecommand?

Esta pregunta ya tiene respuestas aquí :¿Es portátil para ejecutar un comando en la misma línea después de la asignación de variables?

(4 respuestas)
Cerrado hace 2 años.

Uno de mis compañeros de trabajo me proporcionó una sintaxis de Bash con la que no estoy familiarizado. Mi foo de Google me ha fallado al descubrir qué hace y por qué/cuándo debo usarlo.

El comando que me envió fue de esta forma:

someVariable=something 
command

Inicialmente, pensé que esto era equivalente a lo siguiente:

someVariable=something ; command

O

someVariable=something 
command

Pero esto no parece ser el caso. Ejemplos:

[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ

[Jan-03 11:27][~]$ # Try running a command of the same format    
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ

[Jan-03 11:27][~]$    
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:    
[Jan-03 11:27][~]$ echo $BAZ

[Jan-03 11:27][~]$    
[Jan-03 11:28][~]$    
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$

¿Qué hace esta sintaxis? ¿Qué sucede con la variable que se ha establecido? ¿Por qué funciona esto?

Respuesta aceptada:

Esto es equivalente a:

( export someVariable=something; command )

Esto hace que someVariable una variable de entorno, con el valor asignado, pero solo para el comando que se está ejecutando.

Aquí están las partes relevantes del bash manuales:

Comandos simples

Un comando simple es una secuencia de asignaciones de variables opcionales seguido de palabras separadas por espacios en blanco y redirecciones, y terminado por un operador de control. La primera palabra especifica el comando a ejecutar y se pasa como argumento cero. Las palabras restantes se pasan como argumentos al comando invocado.

(…)

Expansión de comando simple

Si no resulta ningún nombre de comando [de la expansión del comando], las asignaciones de variables afectan el entorno de shell actual. De lo contrario, las variables se agregan al entorno del comando ejecutado y no afectan el entorno de shell actual .

Nota:tenga en cuenta que esto no es específico de bash , pero especificado por POSIX.

Relacionado:Debian:¿por qué el recurso compartido CIFS muestra los mismos archivos varias veces?

Editar:discusión resumida de los comentarios en la respuesta

La razón BAZ=JAKE echo $BAZ , no imprime JAKE es porque la sustitución de variables se realiza antes que nada. Si omite la sustitución de variables, esto se comporta como se esperaba:

$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]

Linux
  1. Cómo programar con Bash:Sintaxis y herramientas

  2. Tutorial de estado de salida de Bash Shell con ejemplos prácticos

  3. 15 útiles comandos integrados de Bash Shell (con ejemplos)

  4. 6 Operadores de encadenamiento de línea de comandos de Bash Shell en Linux

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

Comando de espera bash

Comando Bash printf

Cómo usar el comando Declare en Linux Bash Shell

Bash Beginner Series #2:Comprender las variables en Bash Shell Scripting

Uso de la función de historial en Bash Shell en el servidor Ubuntu 16.04 LTS

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