2009-02-06 17 views
6

Puede alguien ayudar a explicar lo siguiente:Bash Scripting - cáscara de redirección de la salida de comandos

Si escribo:

a=`ls -l` 

A continuación, la salida del comando ls se guarda en la variable a

pero si lo intento:

a=`sh ./somefile` 

El resultado está superado en el shell (stdout) en lugar de la variable a

Lo que esperaba era el resultado de la operación del shell que intenta ejecutar un script 'somefile' para ser almacenado en la variable.

Por favor, indique qué está mal con mi comprensión y una posible forma de hacerlo.

Gracias.

EDIT:

Solo para aclarar, puede o no existir el guión 'somefile'. Si aparece, quiero que la salida del script se almacene en 'a'. De lo contrario, quiero que aparezca el mensaje de error "no such file or dir" almacenado en 'a'

Respuesta

15

Creo que porque el shell probablemente se adhiera a/dev/tty, pero puedo estar equivocado. ¿Por qué no acaba de establecer permisos de ejecución en la secuencia de comandos y el uso:

a=`./somefile` 

Si desea capturar stderr y la salida estándar a una, sólo tiene que utilizar:

a=`./somefile 2>&1` 

Para comprobar el archivo es ejecutable primero:

if [[ -x ./somefile ]] ; then 
    a=$(./somefile 2>&1) 
else 
    a="Couldn't find the darned thing." 
fi 

y notará que estoy cambiando al método $() en lugar de los backticks. Prefiero $() ya que puedes anidarlos (por ejemplo, "a=$(expr 1 + $(expr 2 + 3))").

+0

no es sobre los permisos ... quiero que los mensajes de error o los valores devueltos se almacenen en la variable. –

+0

Lo que estoy diciendo es que no necesita ejecutar sh para ejecutar el script (y sh lo impondrá en la salida si lo hace). Simplemente ejecute el script directamente y, para eso, necesita 'chmod + x'. – paxdiablo

+0

Pruebe lo siguiente: "chmod u + x somefile; a ='./ somefile' "y vea lo que se establece entonces. – paxdiablo

5

Puede probar la nueva y mejorada forma de hacer la sustitución de comandos, use $() en lugar de barras invertidas.

a=$(sh ./somefile) 

Si aún así no funciona, compruebe si somefile no es en realidad stderr 'ing.

+0

intenté y no funcionó ... –

+0

probablemente no pueda encontrar algún archivo;) – Bogdan

2

Está en lo cierto, la salida estándar de ./somefile se almacena en la variable a. Sin embargo, asumo salidas de algunos archivos a stderr. Puede redireccionar eso con 2>&1 directamente después de ./somefile.

+0

oh Creo que veo, por lo que la salida en el caso 'somefile' no exsists almacenados en a es nada más que el script por defecto redirige a stderr, ¿por qué veo el mensaje de error en la pantalla en lugar de almacenado en la variable? –

+1

No el stdout de * sh * está almacenado en a, sh no está pasando el stdout de ./somefile a su llamador. – paxdiablo

Cuestiones relacionadas