2016-11-26 8 views
2

Я бег команды:Как перенаправить stderr в файл для всего канала?

mycmd1 | mycmd2 | mycmd3 | lp 

Есть ли способ, чтобы перенаправить поток ошибок в файл для всей трубы вместо того, чтобы повторять это для каждой команды?

То есть, я бы предпочел не делать этого:

mycmd1 2>/myfile | mycmd2 2>/myfile | mycmd3 2>/myfile | lp 2>/myfile 

ответ

6

Либо

{ mycmd1 | mycmd2 | mycmd3 | lp; } 2>> logfile 

или

(mycmd1 | mycmd2 | mycmd3 | lp) 2>> logfile 

будет работать. (Первая версия может иметь немного более быстрое (~ 1 мс) время запуска в зависимости от оболочки).

+1

'{...; } 'лучше, потому что он не создает подоболочку. – janos

+1

Почему подоболочки нежелательны? – springloaded

0

Я попытался следующие, и это похоже на работу:

(mycmd1 | mycmd2 | mycmd3 | lp) 2>>/var/log/mylogfile.log 

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