Как перенаправить stdout и stderr из скрипта 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

Предполагаемое использование:

./install.csh |& tee install.log

Как я могу изменить сценарий, чтобы я по-прежнему получал файл install.log и вывод на консоль, не прося пользователя выполнить перенаправление?


person Shelly Adhikari    schedule 04.12.2009    source источник


Ответы (3)


Несколько простых решений:

Решение 1: добавляйте каждую строку, которую вы хотите регистрировать независимо, используйте переключатель тройника -a для добавления

#!/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

Решение 2. Добавьте второй скрипт. Например, переименуйте текущий файл install.csh в install_commands, а затем добавьте новый скрипт install.csh:

#!/bin/csh -f 
/bin/csh install_commands |& tee install.log
person catchmeifyoutry    schedule 04.12.2009
comment
Спасибо. Я думал, что может быть какой-то другой трюк, который, как я не знаю, приводит к элегантному решению. - person Shelly Adhikari; 05.12.2009
comment
Ооо. хороший призыв разделить его на два сценария. +1 Тем не менее, не думаю, что вам следует придерживаться csh! (-: - person Rob Wells; 05.12.2009

Добрый день,

Я настоятельно рекомендую перейти от csh к чему-то вроде bash или zsh.

Манипулирование stdio невозможно в csh. Прочтите статью "программирование csh считается вредным". Изящный трактат на эту тему.

Извините, это не прямой ответ, но вы обнаружите, что будете продолжать биться головой о ограничениях csh, чем дольше вы придерживаетесь его.

Большая часть синтаксиса csh уже доступна в bash, поэтому кривая обучения не будет слишком крутой.

Вот быстрое предложение для того же самого, написанного в bash. Хотя это не элегантно.

#!/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

Я добавил немного больше проверок и отчетов, так что, если возникнет проблема на более раннем этапе, файл журнала будет содержать только до тех пор, пока ошибка не будет обнаружена, а не стопку довольно бесполезных сообщений об ошибках из более поздних этапов, которые не будут завершены. тем не мение.

ваше здоровье,

person Rob Wells    schedule 04.12.2009
comment
@ Шелли, ой. забыл, что вы хотели дублировать на консоль. - person Rob Wells; 05.12.2009

Вы можете запустить его в подоболочке и перенаправить весь вывод. Не помню, работает ли это в 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
) |& tee install.log
person Walter Underwood    schedule 04.11.2010