Ubuntu: ejecuta la salida de otro comando


13

Tengo una línea de comando que genera una línea de comando diferente, por ejemplo:

> commandlineA param1 param2
  commandlineB param1

Me gustaría tener una ejecución de línea de comando única que ejecute la línea de comando B con los parámetros dados.

¿Hay alguna manera simple de hacerlo usando una sola línea de comando o necesito ejecutar un pequeño archivo bash que almacenará el resultado en una variable y luego lo ejecutará?

Gracias


2
Busqué durante bastante tiempo, pero supongo que tuve que publicar una pregunta para encontrar por mí mismo ... $ (commandlineA param1 param2) hizo el trabajo.
Lior Ohana

Respuestas:


17

Parece que lo resolvió usted mismo, pero puede usar:

$(command parameter1 parameter2)

Edición de edición: lo siguiente es un tanto incorrecto, aunque ejecuta el comando en una subshell, resulta que las variables de entorno aún estarán disponibles. Perdón por engañar a la gente ...

Editar: que se ejecutará en una subshell, no se utilizarán variables de entorno no exportadas Si desea ejecutar un comando en el mismo shell, debe usar:

eval $(command parameter1 parameter2)

Otra respuesta dada es canalizar a través de bash mismo:

echo 'uname -a' | bash 

Eso también se ejecutará en un subshell, para ejecutar en el mismo shell necesitará:

echo 'uname -a' | bash -c

Por cierto, también puede usar ticks de retroceso en lugar de la sintaxis $ (), pero no se recomienda .


(1) No sé exactamente qué quieres decir con "eso se ejecutará en una subshell". Variables de entorno no exportadas se pueden usar. (2) No veo ninguna razón para usar evalaquí. Si tiene un motivo, explíquelo. (3) Su último ejemplo (con  -c) está totalmente equivocado.
Scott

Estás en lo correcto, revisé nuevamente y me equivoqué allí. Cuando se ejecuta como una lista, las bifurcaciones de shell bash y las variables de entorno siguen estando disponibles. Así que tienes razón, perdón por eso.
Chris Sherlock

4

Utilizar este:

commandlineA param1 param2 | bash

Ejemplo:

echo "uname -a" | bash

Salida:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP Lun 11 de abril 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux

No hay nada de malo en esto, sin embargo, generará otro shell de bash.
Chris Sherlock

Así será$(commandlineA param1 param2)
tripleee

@tripleee: Estás comparando naranjas y calabazas.  printf '\143\144\040\057\n' | bashen última instancia, no funciona, porque el comando se ejecuta en un nuevo proceso de shell separado (y transitorio). Por el contrario, $(printf '\143\144\040\057\n')hará que el shell actual, activo e interactivo cambie de directorio.
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.