2009-12-04 14 views
7

Dla Poniższy skryptJak przekierować stdout i stderr z csh skrypt

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 

Przeznaczenie:

./install.csh |& tee install.log 

Jak można tak zmienić skrypt że nadal otrzymuję plik install.log i dane wyjściowe na konsoli bez pytania użytkownika o przekierowanie?

Odpowiedz

7

Niektóre proste rozwiązania:

Rozwiązanie 1: tee każda linia chcesz logować się niezależnie, skorzystać z -a przełącznika tee do dołączania

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

Rozwiązanie 2: Dodaj drugi skrypt. Na przykład, zmiana nazwy aktualnej install.csh do install_commands, następnie dodać nowy skrypt install.csh:

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

Dzięki. Pomyślałem, że może istnieć inna sztuczka, której nie znam prowadząc do eleganckiego rozwiązania –

+0

Oooh. Dobre wezwanie do podzielenia tego na dwa skrypty +1 Wciąż nie sądzisz, że powinieneś trzymać się csh! (-: –

3

G'day,

I wysoce zaleca odejście od csh do czegoś podobnego bash czy zsh.

Obsługa stdio nie jest możliwa w csh. Przeczytaj artykuł "csh programming considered harmful". Elegancki traktat na ten temat.

Niestety, nie jest to bezpośrednia odpowiedź, ale przekonasz się, że będziesz walić w głowę o ograniczenia csh, im dłużej będziesz go trzymać.

Wiele składni csh jest już dostępnych w bash, więc krzywa uczenia się nie będzie zbyt stroma.

Oto krótka propozycja dla tej samej rzeczy napisanej w bashu. To nie jest eleganckie.

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

Dodałam nieco więcej kontroli i raportowania tak, że jeśli jest jakiś problem we wcześniejszym etapie plik dziennika będzie po prostu zawierać aż błąd został otwarty zamiast stosu całkiem niepotrzebnych komunikatów o błędach od późniejsze fazy, które i tak by się nie zakończyły.

okrzyki,

+0

Jak to zrobić w bash? –

+0

@Shelly, dodano. (-: –

+0

@Shelly, oops.) Zapomniałem, że chcesz duplikować do konsoli.) –

0

Można go uruchomić w podpowłoce i przekierować wszystkie dane wyjściowe tego. Nie pamiętam, czy to działa w csh, to był długi, długi czas, odkąd użyłem tego.

#!/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 
Powiązane problemy