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

Запущение скрипта с ударом (выполнение bash test.sh) средства, что сценарий интерпретируется с ударом, не Оболочкой Bourne (/bin/sh). Вот почему это работает. Bash игнорирует #!/bin/sh, потому что это - комментарий. Только загрузчик программы Вашей ОС запускает/bin/sh при выполнении сценария оболочки без удара (выполнение ./test.sh например).

8
05.01.2014, 00:41
3 ответа

Попробуйте сценарий как это:

#!/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
4
27.01.2020, 20:12
  • 1
    >/dev/tty лучше, чем >$(tty) потому что это работает, даже если stdin перенаправляется, и это не должно проходить танец попытки просканировать вокруг в /dev пока правильное устройство не найдено. –  Celada 23.01.2015, 07:23

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

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 производить сообщения "состояния" к, но другие дескрипторы правильного файла должно работать.

Для использования его, при вызове сценария, необходимо включать перенаправление дескриптора файла (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.

[~]#
0
27.01.2020, 20:12

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

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

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

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

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

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

Написать на экран: Эхо «Сообщение» 1> & 3

или ..

Все сделано: Exec 1> & 3 2> & 4 # все возвращается к обычному :)

2
27.01.2020, 20:12

Теги

Похожие вопросы