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

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

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

Для минимального примера у меня есть сценарий оболочки, скажем, «./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 

  • Переместите все подкаталоги и сделайте что-нибудь в сценарии оболочки Unix.
  • Косая черта, не обнаруженная в команде «grep»
  • Обнаруживать, если переменная пуста
  • Файл не найден (cygwin в Windows)
  • сравнить файлы по строкам и создать новое одно bash-программирование
  • Как работает этот скрипт svn?
  • Создание и экспорт / импорт переменной с awk?
  • Как вывести команду оболочки в переменную?
  • 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. [~]# 
    Interesting Posts

    sh команд в .somefile

    Какой самый безопасный (или самый элегантный или самый короткий) способ изменить в каталог, откуда вызывается скрипт?

    git завершение с zsh: имена файлов с пробелами не сбрасываются должным образом

    Переформатируйте или отформатируйте F10 из меню запуска файла окна в Xfce

    Как я могу найти все репозитории subversion в моей системе?

    передавать много похожих файлов по ssh

    Как вы можете достичь «se ai» vi в Emacs?

    Извлеките две строки после строки с определенным значением

    Переключение вкладок с помощью прокрутки мыши

    Сенсорная панель Elantech Mouse не работает хорошо

    содержание grep между двумя стартовыми скобками

    Нужна команда / скрипт, который может генерировать вывод в одной строке со всей необходимой информацией

    Как повлиять на назначение подчиненных UID / GID при создании учетных записей пользователей?

    Почему я не могу просмотреть папку в навигаторе файлов, когда права доступа 766 принадлежат мне?

    Чтение шаблонов grep из файла

    Linux и Unix - лучшая ОС в мире.