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?
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?
exporty 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 defalsesimplemente se descarta. Si en cambio lo hacesse puede actuar sobre el primer comando que falla, por ejemplo, mediante la
errexitconfiguració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)". Verpipefailenman bashpara 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).
localreadonlyfuente
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 quecmdel estado de salida se pierde (pero hizo que el shell salga si fallaset -e).