2009-04-06 19 views
6

suponga que tiene un script de perl "foobar.pl" que imprime el siguiente a la salida estándarejecutar la salida de un script como un comando de bash independiente

date -R 

y desea ejecutar alguna de que las salidas de scripts de Perl como una comando bash autónomo (no se preocupe por los problemas de seguridad ya que esto se está ejecutando en un entorno confiable).

¿Cómo consigues que bash reconozca esto como un comando independiente?

He intentado usar xargs, pero eso parece querer pasar argumentos solo a un comando predefinido.

Quiero que la secuencia de comandos perl pueda generar cualquier comando arbitrario.

$command = 'date -R' 
system($command); ## in the perl script 

lo anterior no funciona porque quiero que se ejecute en un entorno cygwin existente ...

foobar.pl | xargs bash -i {} 

lo anterior no funciona porque fiesta parece estar funcionando un nuevo proceso y por lo tanto la la inicialización y la configuración de bash_profile no se instancian.

Respuesta

4

malo:

`perl foo.pl` 
$(perl foo.pl) 

Por qué esto es malo? Por muchas razones; los que destacan:

  • Wordsplitting: Lo que estamos haciendo aquí es tomar la salida de un script Perl, partiéndolo en trozos donde hay espacios, tabuladores o saltos de línea, y teniendo esos trozos como argumentos a la primera porción, que es el comando para ejecutar. En casos extremadamente simplistas como $(echo 'date +%s'), podría funcionar; pero eso es solo una muy mala representación de lo que REALMENTE estás haciendo aquí.
  • No puede hacer citas ni usar ninguna otra característica de shell bash, como ampliación de parámetros, palabras clave bash, etc.

Bueno, pero un inconveniente:

perl foo.pl > mytmpfile; bash mytmpfile 

La creación de un archivo temporal para poner la salida de su script de Perl en y luego en ejecución que con obras fiesta, pero es poco práctico, ya que necesita para crear (y limpia arriba!) su archivo temporal y tenerlo en una ubicación portátil (¡y segura!).

Recuerde también no utilizar . o source para ejecutar el archivo temporal a menos que realmente desee ejecutarlo todo en el shell activo. Además, cuando usa . o source, no podrá limpiar de manera confiable su archivo temporal posteriormente.

Probablemente la mejor solución:

perl foo.pl | bash 

Esto es bastante seguro integral ("seguro" en el contexto de, menos errores propensa) asumiendo sus salidas script de Perl sintaxis fiesta correcta, por supuesto .

alternativas que más o menos la misma cosa:

bash < <(perl foo.pl) 
bash <(perl foo.pl) 
+0

bash <($ OUTPUT) es lo que estaba buscando. Hace una gran diferencia con la tubería, ya que todavía tiene el control de ella, para las entradas. – yclian

3

Probar:

foobar.pl | bash 
+0

FOO exportación = 'foobar.pl '; $ FOO – ojblass

0

No creo que esto es exactamente lo que está buscando, pero es lo que tengo :-)

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script 

Buena suerte!

5
`foobar.pl` 
+0

+1 por simplicidad. :) –

4

Dado el archivo perl:

print "date"; 

el siguiente comando bash hacerlo.

> $(perl qq.pl) 
Mon Apr 6 11:02:07 WAST 2009 

Pero eso se ejecuta en un caparazón separado. Si realmente desea invocar en el contexto de la actual concha, hacer esto:

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$ 
Mon Apr 6 11:04:59 WAST 2009 
+0

En el caso $(), el comando "perl qq.pl" se ejecuta en un shell separado, pero el comando devuelto por él, "fecha", se ejecuta en el shell actual, que es, creo, lo que él quería. –

+0

No debe usar '.' o' source' para ejecutar los comandos. Nunca se sabe lo que el script hará con su caparazón en ejecución; lo que significa que no puede confiar en el hecho de que incluso tendrá la oportunidad de realizar su limpieza temporal de archivos correctamente. Poner la limpieza en una trampa en EXIT podría ayudar con eso. – lhunath

+0

@lhunath, ¿no leyó la pregunta? Quoth the raven "no te preocupes por los problemas de seguridad ya que esto se está ejecutando en un entorno confiable". Lo tomé para decir que el resultado del guión de Perl estaba controlado. Y el uso de "." fue específicamente para cumplir con el requisito de que no comience un nuevo proceso. – paxdiablo

0

intento con abierta ($ fh, "-", | $ arg1, arg2) $

Cuestiones relacionadas