2016-08-25 6 views
1

Я пытаюсь написать POSIX-совместимый код и хотел бы получить stdout и stderr в файл журнала, а также на экран, используя .Зачем мне возвращаться, чтобы вернуться в системное окно?

Программа работает нормально и делает то, что предполагается ... , но системное приглашение не появляется, пока я не вернусь к возврату каретки (снова). Я не уверен, почему это происходит. Кто-нибудь знает, как я могу избежать этого?

rm mylog.txt 
exec > >(tee -a mylog.txt) 
exec 2>&1 
echo food 
echo bar 
exit 
+0

POSIX-код с заменой процесса? Когда они это добавили? –

+0

Помимо того, что это не POSIX, замещение процесса, вероятно, является причиной вашей проблемы. Это немного шелушатся. Вероятно, он выходит из оболочки, не дожидаясь выхода из процесса 'tee' с первого раза, в результате чего запрос будет перезаписан последним битом вывода из tee –

ответ

1

Никогда не видел синтаксис этой exec > вещи ... так что я не могу объяснить, что вы получите (я не получаю такой же, как вы говорите, - это может быть специфическими для оболочки вы используете).

Вы можете избежать такого поведения, сделав обертку вокруг вашего скрипта; вот как:

#!/bin/bash 
# removing even when non existing 
rm -f mylog.txt 
{ 
    echo food 
    echo bar 
    # testing the stderr too: 
    ls -la non_existant_file 
} 2>&1 | tee -a mylog.txt 
+0

. Я не думаю, что это объясняет, что видит другой_обзор. –

+0

Просто пытаюсь помочь ... Это поможет использовать молоток вместо отвертки, чтобы прибить гвоздь. –

+0

Спасибо, что вы все помогли мне понять немного о том, где я это испортил (много). Я сделаю предложенные изменения. –