¿Existe algún estándar que cubra la portabilidad de ejecutar un comando después de la asignación de variables en la misma línea?
APPLE="cider" echo hi
¿Qué tan portátil es algo así? ¿Dónde funcionará y dónde no?
Además:mis scripts de shell comienzan con #!/bin/sh si eso hace alguna diferencia.
Respuesta aceptada:
Siempre y cuando utilice un shell compatible con POSIX, sí.
De la definición POSIX del lenguaje de comandos de shell:(puntos relevantes en negrita)
Un "comando simple" es una secuencia de asignaciones de variables opcionales y redirecciones, en cualquier secuencia, opcionalmente seguidas de palabras y redirecciones, terminadas por un operador de control.
Cuando se requiere ejecutar un comando simple dado (es decir, cuando cualquier construcción condicional como una lista AND-OR o una declaración de caso no ha pasado por alto el comando simple), las siguientes expansiones, asignaciones y redirecciones se realizarán desde el principio del texto del comando hasta el final:
-
Las palabras que se reconocen como asignaciones variables o las redirecciones de acuerdo con las reglas gramaticales de Shell se guardan para su procesamiento en los pasos 3 y 4.
-
Se ampliarán las palabras que no sean asignaciones variables o redirecciones. Si quedan campos después de su expansión, el primer campo se considerará el nombre del comando y los campos restantes serán los argumentos del comando.
-
Las redirecciones se realizarán como se describe en Redirección.
-
Cada asignación de variable se expandirá para expansión de tilde, expansión de parámetros, sustitución de comandos, expansión aritmética y eliminación de comillas antes de asignar el valor.
En la lista anterior, el orden de los pasos 3 y 4 puede invertirse para el procesamiento de utilidades especiales incorporadas; consulte Utilidades integradas especiales.
Si no resulta ningún nombre de comando, las asignaciones de variables afectarán el entorno de ejecución actual. De lo contrario, las asignaciones de variables se exportarán para el entorno de ejecución del comando y no afectarán al entorno de ejecución actual (excepto para empotrables especiales).
Además, sí #!/bin/sh
asuntos. De la definición POSIX de sh
:
La utilidad sh es un intérprete de lenguaje de comandos que ejecutará los comandos leídos desde una cadena de línea de comando, la entrada estándar o un archivo específico. La aplicación se asegurará de que los comandos a ejecutar estén expresados en el lenguaje descrito en Shell Command Language .
Así que básicamente dice que sh
debe seguir las reglas que cubrimos anteriormente.
Entonces, siempre que tenga un sistema operativo compatible con POSIX, está bien.