2013-12-26 3 views
0

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

Script.sh: 
count=1 
while [ $count -le 10 ] 
do 
    echo "`date` : Function call, loopcount - $count" | tee -a logfile.log 
    functioncall 
    count=$($count + 1) 
done 

Функция fucntioncall() определена в том же скрипте.

functioncall(){ 

<some processing> 
cd $Location 
<some processing> 
} 

Когда я бегу script.sh, этот скрипт работает успешно, но только одна запись сделана в logfile.log, для первого запуска, в то время как на экране вывода я могу видеть, что цикл выполняется для 10 раз с правильной петлей увеличивается и отображается, но запись в файле logfile.log не выполняется.

Когда я комментирую строку cd $Location в скрипте, она ведет себя по желанию, означает, что и O/P, и logfile.log показывают правильный цикл.

Любая идея, почему это неопределенное поведение наблюдается? Любое исправление/обходное решение очень ценится!

+1

Ищите 'logfile.log' в' $ Location'. – Mat

+0

Спасибо @Mat! Я получаю его во время отладки с использованием опции pushd и popd, вычислен логической ошибкой – pRAShANT

+0

Также вы имели в виду 'while [$ count -le 10]'? – anishsane

ответ

1

При изменении каталога он изменяется. Это означает, что тэ будет писать в новый файл.

Возможные решения:

  • вместо tee -a logfile.log использовать tee -a <absolute_path_to_current_directory>/logfile.log
  • двигаться весь tee вне цикла:

    while 
    do 
        stuff 
    done | tee logfile.log # bonus - you don't need -a here 
    
  • возврата в исходное место после cd. Что должно быть сделано на самом деле с pushd и popd

  • не делаем cd в основной оболочке. Выполните всю обработку в субоболочке:

    (cd $location; 
        <some processing>) 
    

Я сам предпочитаю последний.

С другой стороны (и это может быть даже лучше) - перепишите обработку, чтобы избежать cd.