Как выводить на экран переопределение перенаправления

Возможно ли в сценарии оболочки писать на экран при перенаправлении STDOUT и STDERR?

У меня есть сценарий оболочки, который я хочу захватить STDOUT и STDERR. Скрипт будет работать в течение часа или более, поэтому я хочу иногда писать некоторые сообщения о статусе на экран, который будет отображаться и не перенаправляться (не записываться).

  • Могу ли я читать и писать в тот же файл в Linux, не перезаписывая его?
  • значение переменной оболочки для цикла, отличного от цикла
  • bash - Функция escape-символа?
  • Можно ли обновить заголовки окон терминала во время выполнения процесса?
  • Как я могу отправить несколько параметров одной переменной
  • Выровнять шестнадцатеричный текстовый файл по 9 байт каждой строки
  • Для минимального примера у меня есть сценарий оболочки, скажем, «./myscript.sh»:

    #!/bin/sh -u echo "Message A: This writes to STDOUT or wherever '1>' redirects to." echo "Message B: This writes to STDOUT or wherever '1>' redirects to.">&1 echo "Message C: This writes to STDERR or wherever '2>' redirects to.">/dev/stderr echo "Message D: This writes to STDERR or wherever '2>' redirects to.">&2 echo "Message E: Write this to 'screen' regardless of (overriding) redirection." #>??? 

    Затем, например, я хотел бы увидеть этот вывод, когда я запускаю скрипт следующим образом:

     [~]# ./myscript.sh > fileout 2> filerr Message E: Write this to 'screen' regardless of (overriding) redirection. [~]# ./myscript.sh > /dev/null 2>&1 Message E: Write this to 'screen' regardless of (overriding) redirection. [~]# 

    Если это невозможно сделать «напрямую», возможно ли временно прекратить перенаправление, затем распечатать что-то на экране, а затем восстановить перенаправление так, как было?

    Некоторая информация о компьютере:

     [~]# uname -srvmpio Linux 3.2.45 #4 SMP Wed May 15 19:43:53 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux [~]# ls -l /bin/sh /dev/stdout /dev/stderr lrwxrwxrwx 1 root root 4 Jul 18 23:18 /bin/sh -> bash lrwxrwxrwx 1 root root 15 Jun 29 2013 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 Jun 29 2013 /dev/stdout -> /proc/self/fd/1 

  • Cygwin: readline lib загружается в разных местах
  • Какой ваш любимый графический редактор GUI / CLI скрипта и почему?
  • Используя vi keybindings для readline, как мне перейти к началу строки?
  • Проверка бинарных файлов команд перед выполнением
  • Одновременно проверьте наличие пустого выхода и успешный статус выхода
  • Как разделить текст между разделителем на несколько файлов?
  • 3 Solutions collect form web for “Как выводить на экран переопределение перенаправления”

    Попробуйте сценарий следующим образом:

     #!/bin/bash echo "to fd1" >&1 echo "to fd2" >&2 echo "to screen" >$(tty) 

    Когда вы это называете, это выглядит так:

     user@host:~# ./script to fd1 to fd2 to screen user@host:~# ./script 1>/dev/null to fd2 to screen user@host:~# ./script 2>/dev/null to fd1 to screen user@host:~# ./script > /dev/null 2>&1 to screen 

    я не знаю обо всем перенаправлении tty, но это то, что я делаю:

    На самом деле не перенаправляйте, а отправляйте требуемый результат в качестве параметра или, если вы перенаправляетесь в самом скрипте, вы можете в любой момент переключить перенаправление, выполнив:

     exec 2> /some/new/destination 1> /some/other/destination 

    но вы можете сохранить старые …

     exec 3>&1 4>&2 2> /some/new/destination 1> /some/other/destination 

    таким образом вы можете вернуться к нему … когда вы закончите или хотите записать на экран

    написать на экран: echo "message" 1>&3

    или..

    все сделано: exec 1>&3 2>&4 # все возвращается к нормальной жизни 🙂

    Используя пример из ответа хаосом :

     echo "to screen" >$(tty) 

    не работал для меня. Я получаю сообщение об ошибке при попытке использовать его:

     ./myscript.sh: line xx: /dev/pts/3: Permission denied 

    Я придумал решение использовать другой дескриптор файла (9). Вот «./myscript.sh»:

     #!/bin/sh -u ## This is placed one time at the top of the script ## to detect if file descriptor (9) is available for writing. if [ ! -t 3 ]; then echo "Error, file descriptor (9) not open on terminal." >&2 echo "" >&2 if [ ! -t 2 ]; then echo "Error, file descriptor (9) not open on terminal." echo "" fi exit 1 fi echo "Message A: This writes to stdout or wherever '1>' redirects to." echo "Message B: This writes to stdout or wherever '1>' redirects to.">&1 echo "Message C: This writes to stderr or wherever '2>' redirects to.">/dev/stderr echo "Message D: This writes to stderr or wherever '2>' redirects to.">&2 echo "Message E: Write this to 'screen' regardless of '1>/2>' redirection." >&9 echo " " >&9 

    Я использовал файловый дескриптор 9 для вывода сообщений «status», но другие действующие файловые дескрипторы должны работать.

    Чтобы использовать его, при вызове сценария вы должны включить перенаправление дескриптора файла (9) в STDOUT (9> и 1) в качестве первого перенаправления.

    Вот вывод, когда я вызываю «./myscript.sh»:

     [~]# ./myscript.sh [~]# ./myscript.sh >/dev/null [~]# ./myscript.sh 2>/dev/null Error, file descriptor (9) not open on terminal. [~]# ./myscript.sh >/dev/null 9>&1 Error, file descriptor (9) not open on terminal. [~]# ./myscript.sh 9>&1 >/dev/null Message C: This writes to stderr or wherever '2>' redirects to. Message D: This writes to stderr or wherever '2>' redirects to. Message E: Write this to 'screen' regardless of '1>/2>' redirection. [~]# ./myscript.sh 9>&1 2>/dev/null Message A: This writes to stdout or wherever '1>' redirects to. Message B: This writes to stdout or wherever '1>' redirects to. Message E: Write this to 'screen' regardless of '1>/2>' redirection. [~]# ./myscript.sh 9>&1 >/dev/null 2>&1 [~]# ./myscript.sh 9>&1 &>/dev/null [~]# ./myscript.sh 9>&1 >&/dev/null Message E: Write this to 'screen' regardless of '1>/2>' redirection. [~]# 
    Linux и Unix - лучшая ОС в мире.