Запущение скрипта с ударом (выполнение bash test.sh
) средства, что сценарий интерпретируется с ударом, не Оболочкой Bourne (/bin/sh). Вот почему это работает. Bash игнорирует #!/bin/sh, потому что это - комментарий. Только загрузчик программы Вашей ОС запускает/bin/sh при выполнении сценария оболочки без удара (выполнение ./test.sh
например).
Попробуйте сценарий как это:
#!/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
Используя пример из ответа хаосом:
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.
[~]#
Я не знаю обо всех 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
# все возвращается к обычному :)
>/dev/tty
лучше, чем>$(tty)
потому что это работает, даже если stdin перенаправляется, и это не должно проходить танец попытки просканировать вокруг в/dev
пока правильное устройство не найдено. – Celada 23.01.2015, 07:23