2009-12-04 16 views
7

Para la siguiente secuencia de comandosCómo redirigir stdout y stderr desde el guión CSH

install.csh:

 
#!/bin/csh -f 
tar -zxf Python-3.1.1.tgz 
cd Python-3.1.1 
./configure 
make 
make install 
cd .. 
rm -rf Python-3.1.1 

Uso previsto:

./install.csh |& tee install.log 

¿Cómo puedo cambiar la secuencia de comandos para que todavía obtengo un install.log y el resultado en la consola sin pedirle al usuario que redireccione?

Respuesta

7

algunas soluciones simples:

Solución 1: camiseta cada línea que desea iniciar sesión de forma independiente, hacer uso de -a interruptor de la camiseta para anexar

#!/bin/csh -f  
tar -zxf Python-3.1.1.tgz |& tee -a install.log 
cd Python-3.1.1 |& tee -a install.log 
./configure |& tee -a install.log 
make |& tee -a install.log 
make install |& tee -a install.log 
cd .. |& tee -a install.log 
rm -rf Python-3.1.1 |& tee -a install.log 

Solución 2: Agrega una segunda secuencia de comandos. Por ejemplo, cambiar el nombre actual a install.csh install_commands, continuación, añadir un nuevo guión install.csh:

#!/bin/csh -f 
/bin/csh install_commands |& tee install.log 
+0

Gracias. Estaba pensando que podría haber algún otro truco que no conozco para llegar a una solución elegante. –

+0

Oooh. Una buena llamada para dividirlo en dos secuencias de comandos. +1 ¡Aún así, no creo que deba seguir con csh! (-: –

3

día G,

I altamente recomiendan alejarse de CSH hacia algo como bash o zsh.

stdio manipulación no es posible en csh. Lea "csh programming considered harmful". Un elegante tratado sobre este tema.

Disculpe, no es una respuesta directa, pero descubrirá que seguirá golpeando su cabeza contra las limitaciones de csh cuanto más lo mantenga.

Mucha sintaxis de csh ya está disponible en bash, por lo que su curva de aprendizaje no será demasiado pronunciada.

Aquí hay una sugerencia rápida para lo mismo escrito en bash. Aunque no es elegante.

#!/bin/bash 
TO_LOGFILE= "| tee -a ./install.log" 
tar -zxf Python-3.1.1.tgz 2>&1 ${TO_LOGFILE} 
if [ $? -ne 0 ];then 
    echo "Untar of Python failed. Exiting..."; exit 5 
fi 

cd Python-3.1.1 2>&1 ${TO_LOGFILE} 
if [ $? -ne 0 ];then 
    echo "Can't change into Python dir. Exiting..."; exit 5 
fi 
echo "============== configure ================" 
./configure 2>&1 ${TO_LOGFILE} 
if [ $? -ne 0 ];then 
    echo "Configure failed. Exiting..."; exit 5 
fi 
echo "================ make ===================" 
make 2>&1 ${TO_LOGFILE} 
if [ $? -ne 0 ];then 
    echo "Compile of Python failed. Exiting..."; exit 5 
fi 
echo "================ install ================" 
make install 2>&1 ${TO_LOGFILE} 
if [ $? -ne 0 ];then 
    echo "Install of Python failed. Exiting..."; exit 5 
fi 

cd .. 
rm -rf Python-3.1.1 2>&1 ${TO_LOGFILE} 
exit 0 

He añadido un poco más el control y la presentación de informes de manera que si hay un problema en una etapa anterior del archivo de registro solo contendrá hasta hasta que el error fue descubierto en lugar de una pila de mensajes de error bastante inútil desde el fases posteriores que no se completarían de todos modos.

aplausos,

+0

¿Cómo haré eso en bash? –

+0

@Shelly, agregado. (-: –

+0

@Shelly, oops. Olvidó que quería duplicar en la consola. –

0

se puede ejecutar en un subnivel y redireccionar toda la salida de ello. No recuerdo si esto funciona en csh, ha pasado mucho, mucho tiempo desde que lo usé.

#!/bin/csh -f 
(
tar -zxf Python-3.1.1.tgz 
cd Python-3.1.1 
./configure 
make 
make install 
cd .. 
rm -rf Python-3.1.1 
) |& tee install.log 
Cuestiones relacionadas