2011-04-27 16 views
7

Quiero un script para redirigir stdin y stderr a un archivo, hacer un montón de cosas, luego deshacer esas redirecciones y tomar medidas sobre el contenido del archivo. Estoy tratando:bash: cómo redirigir stdin/stderr y luego revertir fd's?

function redirect(){ 
    exec 3>&1 
    exec 4>&2 
    exec 1>outfile 2>&1 
} 
function undirect(){ 
    exec 1>&3 
    exec 2>&4 
} 
echo first 
redirect 
echo something 
cat kjkk 
undirect 
if some_predicate outfile; then echo ERROR; fi 

Lo que parece hacer lo que quiero, pero parece bastante complejo. ¿Hay una forma más limpia/clara de hacer esto?

Respuesta

8

Si realmente necesita cambiarlo de un lado a otro, sin saber de antemano qué irá donde y cuándo, esa es más o menos la manera de hacerlo. Dependiendo de sus necesidades aunque podría ser más ordenado para aislar las partes que necesitan redireccionamiento, y ejecutarlos como grupo, así:

echo first 
{ 
    echo something 
    cat kjkk 
} 1>outfile 2>&1 
if some_predicate outfile; then echo ERROR; fi 

la {} se llama un comando de grupo, y la salida de todo el grupo se redirige . Si lo prefiere, puede hacer sus ejecutivos en una subshell, ya que solo afecta a la subshell.

echo first 
(
    exec 1>outfile 2>&1 

    echo something 
    cat kjkk 
) 
if some_predicate outfile; then echo ERROR; fi 

Tenga en cuenta que estoy usando paréntesis () aquí, en lugar de los apoyos ({} que se utilizaron en el primer ejemplo).

HTH

+0

o incluso en el shell actual: '{echo algo; gato afile; }> archivo de salida 2> & 1' –

+0

@glenn; derecho. el primero podría ser así, probablemente también mejor ... editaré – falstro

3

Me parece bastante limpio. La única cosa que me gustaría que consiste en pasar el "archivo de salida" nombre como un parámetro a la función, ya que se utiliza el nombre del archivo fuera de la función

redirect() { 
    exec 3>&1 
    exec 4>&2 
    exec 1>"$1" 2>&1 
} 
: 
redirect outfile 
: 
if some_predicate outfile; ... 
Cuestiones relacionadas