Saltar al contenido

¿Por qué no puedo usar variables como prefix a un comando para establecer variables de entorno?

Esta es el arreglo más exacta que te podemos brindar, pero obsérvala detenidamente y analiza si se puede adaptar a tu proyecto.

Solución:

Sospecho que esta es la parte de la secuencia que te está atrapando:

Las palabras que no son asignaciones de variables o redirecciones se expanden (ver Expansiones de Shell). Si queda alguna palabra después de la expansión, la primera palabra se toma como el nombre del comando y las palabras restantes son los argumentos.

Eso es del manual de referencia de Bash en la sección sobre Expansión de comandos simples.

En el cmd=bash ejemplo, no se establecen variables de entorno y bash procesa la línea de comandos a través de la expansión de parámetros, dejando bash -c "echo hi".

En el prefix=hello=hi ejemplo, nuevamente no hay asignaciones de variables en el primer paso, por lo que el procesamiento continúa con la expansión de parámetros, lo que da como resultado una primera palabra de hello=hi.

Una vez que se han procesado las asignaciones de variables, no se vuelven a procesar durante la ejecución del comando.

Vea el procesamiento y sus resultados en set -x:

$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42

Para una variación más segura de "expansión variable" -como- "variables de entorno" que evalconsidere la sugerencia de wjandrea de env:

prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi

No es estrictamente una asignación de variable de línea de comando, ya que estamos usando el env función principal de la utilidad de asignar variables de entorno a un comando, pero logra el mismo objetivo. los $prefix variable se expande durante el procesamiento de la línea de comando, proporcionando el nombre = valor para envquien se lo pasa a bash.

Porque $prefix no es una tarea. @Jeff tiene la explicación más larga.

Podrías hacer algo similar con una función en su lugar:

$ prefix()  hello=hi "[email protected]"; 
$ prefix bash -c 'echo "$hello"'
hi

...e incluso puedes apilarlos, si quieres:

$ foo()  foo=123 "[email protected]"; 
$ bar()  bar=456 "[email protected]"; 
$ foo bar bash -c 'echo "$bar $foo"'
456 123

Comentarios y puntuaciones del tutorial

Al final de todo puedes encontrar las reseñas de otros sys admins, tú además eres capaz dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.