Сбросить STDOUT FD в ловушку

скрипт

#!/usr/bin/env bash # Exit on error. Append "|| true" if you expect an error. set -o errexit # Exit on error inside any functions or subshells. set -o errtrace # Do not allow use of undefined vars. Use ${VAR:-} to use an undefined VAR set -o nounset # Catch the error in case mysqldump fails (but gzip succeeds) in `mysqldump |gzip` set -o pipefail # Turn on traces, useful while debugging but commented out by default set -o xtrace bash_backtrace() { echo TEST ls -l /proc/$$/fd >&2 } trap bash_backtrace ERR CMD="ls /does-not-exist" eval "${CMD}" > /tmp/foo exit 

Вывод

  • Как я могу совместно использовать stdout между несколькими процессами?
  • Проблемы с scp, если я использую bashrc для открытия рыбы, если она присутствует
  • Как использовать оператор case для обработки нескольких возвращаемых значений
  • Bash конвертирует имена путей для sed, чтобы они избегали
  • Обертка скрипта оболочки с тройником
  • Преобразование вывода диска в читаемую HTML-почту
  •  $ ./test.sh + trap bash_backtrace ERR + CMD='ls /does-not-exist' + eval 'ls /does-not-exist' ++ ls /does-not-exist ls: cannot access /does-not-exist: No such file or directory +++ bash_backtrace +++ echo TEST +++ ls -l /proc/19650/fd total 0 lrwx------. 1 sbarre sbarre 64 Apr 18 15:57 0 -> /dev/pts/0 l-wx------. 1 sbarre sbarre 64 Apr 18 15:57 1 -> /tmp/foo lrwx------. 1 sbarre sbarre 64 Apr 18 15:57 10 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 18 15:57 2 -> /dev/pts/0 lr-x------. 1 sbarre sbarre 64 Apr 18 15:57 255 -> /home/sbarre/test.sh 

    Поскольку мой eval бросает ошибку и попадает в ловушку, stdout все еще указывает на / tmp / foo. Таким образом, любое эхо в моей функции ловушки пойдет в этот файл, а не в терминал.

    Как можно безопасно сбросить эту функцию в функции ловушки? Мне нужно обработать, когда сам сценарий запускается таким образом, что его stdout перенаправляется.

     $ ./test.sh > log.txt 

    Я бы хотел «исправить» stdout обратно в log.txt из /tmp/foo

  • Может ли xxd использоваться для вывода двоичного представления шестнадцатеричного числа, а не строки?
  • whatis command Ошибка перенаправления выходных данных
  • Переменная Shell в теге <a href>
  • Запуск построенной команды из сценария bash
  • Есть ли инструмент для динамического перенаправления вывода на новый файл по запросу
  • Как заставить скрипт работать как демон, ожидая изменений в 2 файлах?
  • 2 Solutions collect form web for “Сбросить STDOUT FD в ловушку”

    Это именно то, для чего нужен стандартный поток ошибок.

     bash_backtrace() { echo TEST >&2 ls -l "/proc/$$/fd" >&2 } 

    Ловушка выводит диагностическое сообщение ( TEST ). Это не должно идти на стандартный вывод, а на стандартную ошибку.

    Связано: « Имеются ли отчеты о ходе выполнения / данные регистрации на stderr или stdout? »

    Я решил это, используя exec чтобы клонировать дескрипторы, а затем восстанавливать их в функции trap. Таким образом, независимо от того, где STDERR собирается при запуске скрипта, вывод из ловушки тоже туда пойдет.

    скрипт

     #!/usr/bin/env bash # Exit on error. Append "|| true" if you expect an error. set -o errexit # Exit on error inside any functions or subshells. set -o errtrace # Do not allow use of undefined vars. Use ${VAR:-} to use an undefined VAR set -o nounset # Catch the error in case mysqldump fails (but gzip succeeds) in `mysqldump |gzip` set -o pipefail # Turn on traces, useful while debugging but commented out by default set -o xtrace # Copy STDOUT and STDERR exec 3>&1 4>&2 bash_backtrace() { ls -l /proc/$$/fd >$(tty) # Restore STDOUT and STDERR exec 1>&3 2>&4 echo TEST echo >&2 ERROR ls -l /proc/$$/fd >&2 } trap bash_backtrace ERR CMD="ls /does-not-exist" eval "${CMD}" > /tmp/foo 2> /tmp/bla exit 

    Вывод

     + exec + trap bash_backtrace ERR + CMD='ls /does-not-exist' + eval 'ls /does-not-exist' total 0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 0 -> /dev/pts/0 l-wx------. 1 sbarre sbarre 64 Apr 19 13:22 1 -> /tmp/foo lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 10 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 11 -> /dev/pts/0 l-wx------. 1 sbarre sbarre 64 Apr 19 13:22 2 -> /tmp/bla lr-x------. 1 sbarre sbarre 64 Apr 19 13:22 255 -> /home/sbarre/test.sh lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 3 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 4 -> /dev/pts/0 +++ echo TEST TEST +++ echo ERROR ERROR +++ ls -l /proc/11910/fd total 0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 0 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 1 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 10 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 11 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 2 -> /dev/pts/0 lr-x------. 1 sbarre sbarre 64 Apr 19 13:22 255 -> /home/sbarre/test.sh lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 3 -> /dev/pts/0 lrwx------. 1 sbarre sbarre 64 Apr 19 13:22 4 -> /dev/pts/0 
    Linux и Unix - лучшая ОС в мире.