Как перенаправить стандартный вывод и стандартный вывод из сценария csh - PullRequest
8 голосов
/ 04 декабря 2009

Для следующего скрипта

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 и вывод на консоль, не прося пользователя выполнить перенаправление?

Ответы [ 3 ]

7 голосов
/ 04 декабря 2009

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

Решение 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
3 голосов
/ 04 декабря 2009

G'day,

Я очень рекомендую перейти от 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

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

ура

0 голосов
/ 04 ноября 2010

Вы можете запустить его в подоболочке и перенаправить весь вывод этого. Не помню, работает ли это в 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
...