sirve - Establecer una variable de entorno antes de que un comando en bash no funcione para el segundo comando en una canalización
operaciones aritmeticas shell script (4)
¿Qué hay de exportar la variable, pero solo dentro de la subshell ?:
(export FOO=bar && somecommand someargs | somecommand2)
Keith tiene un punto, para ejecutar incondicionalmente los comandos, haga esto:
(export FOO=bar; somecommand someargs | somecommand2)
En un shell dado, normalmente establecía una variable o variables y luego ejecutaba un comando. Recientemente aprendí sobre el concepto de anteponer una definición de variable a un comando:
FOO=bar somecommand someargs
Esto funciona ... algo así. No funciona cuando está cambiando una variable LC_ * (que parece afectar el comando pero NO sus argumentos, por ejemplo, los rangos de caracteres [[az] '') o cuando se canaliza la salida a otro comando por lo tanto:
FOO=bar somecommand someargs | somecommand2 # somecommand2 is unaware of FOO
También puedo anteponer somecommand2 con "FOO = bar", que funciona pero que agrega duplicación no deseada, y no ayuda con los argumentos que se interpretan según la variable (por ejemplo, ''[az]'')
Entonces, ¿cuál es una buena manera de hacer esto en una sola línea? Estoy pensando algo en el orden de:
FOO=bar (somecommand someargs | somecommand2) # Doesn''t actually work
Edit: Tengo muchas buenas respuestas! El objetivo es mantener esto como una sola línea, preferiblemente sin usar "exportar". El método que utiliza una llamada a bash fue el mejor en general, aunque la versión entre paréntesis con "exportar" era un poco más compacta. El método de usar la redirección en lugar de una tubería también es interesante.
¿Qué hay de usar un script de shell?
#!/bin/bash
# myscript
FOO=bar
somecommand someargs | somecommand2
> ./myscript
También puedes usar eval
:
FOO=bar eval ''somecommand someargs | somecommand2''
Ya que esta respuesta con eval
no parece complacer a todos, permítame aclarar algo: cuando se usa como está escrito, con las comillas simples , es perfectamente seguro. Es bueno ya que no iniciará un proceso externo (como la respuesta aceptada) ni ejecutará los comandos en una subshell adicional (como la otra respuesta).
A medida que obtengamos algunos puntos de vista regulares, probablemente sea bueno dar una alternativa a la eval
que satisfaga a todos, y tenga todos los beneficios (y tal vez aún más) de este "truco" de eval
rápida. ¡Solo usa una función! Define una función con todos tus comandos:
mypipe() {
somecommand someargs | somecommand2
}
y ejecútalo con tus variables de entorno como esta:
FOO=bar mypipe
FOO=bar bash -c ''somecommand someargs | somecommand2''