2016-07-12 3 views
1

У меня есть сценарий, как в следующемизбежать эхо-вывод перенаправлять в файл

function long_proc() 
{ 
    #script1 that generate output1 
    #script2 that generate output2 
    .... 
} 

long_proc > /tmp/debug.log 

Мое требование полный журнал должен переадресовать к /tmp/debug.log, где, как выход Скрипт2 должен идти к stdout, а также к журнальный файл.

Может ли кто-нибудь мне помочь?

+0

'long_proc> /tmp/debug.log 2> & 1 '? – Cyrus

+0

Используйте команду tee – 123

+1

@cyrus, она выведет полный журнал в файл, а также stdout, не так ли? Но мое требование - это нечто другое. вывод некоторой команды должен быть перенаправлен в stdout. – shafeeq

ответ

2

Так вот что я думаю, что вы хотите сделать.

Чтобы сохранить выход на стандартный вывод, но и перейти в файл

long_proc(){ 

    exec 4>&1 
    #redirect fd4(currently nothing hopefully) to stdout 

    exec 1>&3 
    #redirect stdout to fd3(also hopefully unused) 
    #Note you have 5 more to choose from if they are in use. 


    echo Just log 
    #script1 that generate output1 

    echo Log and Stdout | tee >(cat - >&4) 
    #script1 that generate output2 
    # Tee into a subproc to cat data into fd4 pointing to stdout 
    #The tee'd data also goes to fd3 

    exec 1>&4 
    # set fd1 back to stdout 

    exec 4>&- 
    #close fd4 

} 

long_proc 3> log 
#Send fd3 to log, stdout is untouched and does whatever you want. 

Так перенаправить весь вывод FD3, который затем все поступает в журнал. Тройник в stdout все, что вы хотите также быть в стандартном режиме.

Преимущество этого в том, что вы можете затем трубы как

long_proc 3> log | sed 's/^/Piped and /' 
+1

Ваши два выражения 'exec' влияют на оболочку, из которой вызывается' long_proc'; они не являются локальными для тела функции. Вы должны либо использовать подоболочку как тело ('long_proc() (...)'), либо восстановить дескрипторы файла перед выходом. – chepner

+0

@chepner Edited. – 123

+0

можете ли вы добавить несколько пояснений о 4> и 1 .. ?? – shafeeq

Смежные вопросы