De Cuál es el último argumento de la orden anterior?
shellcheck le dice que no exporte variables en la misma línea que las asigna.
Me preguntaba por qué?
¿Se aplica el mismo consejo a alias
, declare
, export
, local
, readonly
, y typeset
?
export
y asignarían juntos. El Bourne Shell de la herencia , por ejemplo, da salida a una "foo = 2 no es un identificador" error.Respuestas:
El problema es que en Bash cada comando tiene un solo código de salida. Cuando
export foo="$(false)"
el código de salida defalse
simplemente se descarta. Si en cambio lo hacesse puede actuar sobre el primer comando que falla, por ejemplo, mediante la
errexit
configuración.Declarar y asignar un literal de cadena como
export foo='bar'
, por supuesto, no sufre este problema. Pero el cambio es la única constante en el desarrollo de software, y es simplemente un buen mantenimiento de las declaraciones a prueba de futuro dividiéndolos.Además de los comandos específicos de la asignación que menciona, también hay varios comandos en una sola asignación, como
foo="$(false)$(true)"
. Verpipefail
enman bash
para otro tal trampa.Otra cosa para recordar es que la secuencia de declaración y asignación a veces es relevante. Por ejemplo, querrá declarar variables antes de asignarlas. (Desafortunadamente no es posible declarar variables antes de asignarlas por primera vez).
local
readonly
fuente
export
, por lo que durante algunos años se recibió la sabiduría de hacerlo si era probable que el intérprete de uno fuera el shell Bourne.foo=$(cmd) export foo
, aunque con la misma advertencia quecmd
el estado de salida se pierde (pero hizo que el shell salga si fallaset -e
).