Дескрипторы файлов оболочки Unix - PullRequest
0 голосов
/ 26 декабря 2018

Мне нужно запустить программу с именем pg.sh.Он сообщает стандартный вывод в выходной журнал.Как сохранить stdout и stderr и stdout в 2 отдельных файлах журнала?

Я искал и получил следующий код

(pg.sh 2>&1 1>&3 ) 3>&1 1>&2 | tee output.log) > final.log 2>&1

Я понимаю, 1 и 2 - это дескрипторы файлов, указывающие на stdout иSTDERR.3 - еще один дескриптор файла, указывающий на стандартный вывод.

Приведенный выше код работает нормально, но я не понимаю, как это достигается.Может ли кто-нибудь помочь мне с написанным кодом?

1 Ответ

0 голосов
/ 26 декабря 2018

начиная с внешнего перенаправления: ( .. ) 3>&1 1>&2, важен порядок:

  • fd 3 открыт для записи как дубликат 1 (стандартный вывод: здесь это канал ввода)
  • , затем fd 1 сокрушается как дубликат 2 (stderr) (или перенаправляется на stderr)

вход | является тогда fd 3, тогда как stderr не захватывается тройником,

Вложенное перенаправление:

  • fd 2 перенаправляется на stdout (который был перенаправлен на внешний stderr)
  • fd 1 перенаправляется на fd 3 (которыйбыл перенаправлен на внешний stdout)

    , поскольку выходные данные дубликатов тройника регистрируются (окончательное перенаправление >final.log 2>&1, так как fd 2 открыт после fd 1, они оба перенаправлены на final.log) файл final.log будетсодержит программу stdout и stderr, но output.log только stdout.

Может быть, это можно было бы написать проще, используя 3>&1 1>&2 2>&3, который изменяет stdout и stderr.

Следующеедолжен сделать то же самое:

( pg.sh | tee output.log ) >final.log 2>&1

Следующее пишет программа stdoutв файл output.log stderr в файл error.log и оба в файл final.log.

( ( pg.sh | tee output.log ) 3>&1 1>&2 2>&3 | tee error.log ) >final.log 2>&1
...