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

Возможно ли в сценарии оболочки писать на экран при перенаправлении 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 

  • Сколько снарядов я глубоко?
  • Что означает `1 >>` и `2 >>` в сценарии bash?
  • Cron не запускается в определенный день, но все остальные дни
  • Организация одного сценария с помощью другого
  • Как написать вывод на экран из службы systemd во время загрузки?
  • Развертывание Jenkins не передается переменной java
  • Есть ли команда под названием «on» для выполнения команд на удаленных компьютерах?
  • Как изменить / исправить команду v меньше, используя профиль оболочки?
  • 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

    почему нельзя переименовать subdir, если родительский dir-владелец не является тем же пользователем

    Странное поведение неинициализированных массивов и неустановленных массивов

    Ошибка rsync: необъяснимая ошибка (код 255) в io.c (226)

    Как настроить права доступа / права доступа для FTP / Apache / PHP на CentOS

    xargs: Имеет ли порядок вариантов?

    Пул нельзя импортировать, поскольку он форматируется с использованием несовместимой версии

    apt зеркало выбирает неправильную архитектуру

    Какова связь между каталогами «/etc/init.d» и «/etc/rcX.d» в Linux?

    Могу ли я удалить пакеты * -dev, если я не компилирую приложения из исходного кода?

    Существует ли общий способ построения 32-битных проектов на 64-битной системе?

    Могу ли я отключить perl со списком из команды поиска unix?

    Как вставить новые строки в PATTERN при использовании fgrep / grep -F / grep -fixed-strings

    Как заменить символ || с | "" | использование sed

    ЕСЛИ ЛИШЬ сравнение строк из curl

    Установка другого Linux на зашифрованном диске

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