Записать в терминал после перенаправления stdout в файл без использования stderr?
У меня есть два сценария оболочки, один из которых служит основной "программой", а другой - "библиотекой".
В нескольких местах в "программе" я сделаю что-то вроде: log "$thing" >> "$logfile"
, где log
это функция, определенная в "библиотеке".
# program.sh
logfile="log.txt"
stuff="hahah heheh hoho"
. library.sh
for thing in $stuff; do
log "$thing" >> "$logfile"
done
Мой вопрос: есть ли способ перенаправить часть вывода из функции обратно в терминал без использования stderr
?
# library.sh
log () {
# This gets written to the log
echo "`date --rfc-3339=seconds`: $1"
# How to write this to the terminal *without* using stderr?
echo "Info: Message written to log." >&2
}
Я хочу избежать использования stderr
потому что в моей настоящей программе есть возможность перенаправлять ошибки в файл, но сообщения, которые я хочу отправить на терминал, являются информационными, а не ошибками, и должны всегда отображаться на терминале.
2 ответа
Решение
Открыто /dev/tty
на другом FD.
exec 0< /dev/null
exec 1> /dev/null
exec 2> /dev/null
exec 3> /dev/tty
echo 'Hello, World!' >&3
Вы можете написать напрямую /dev/tty
каждый раз, когда вы хотите написать в терминал:
echo "hello world" > /dev/tty
Для небольшого примера:
$ cat writer.sh
#!/bin/sh
echo "standard output"
echo "standard error" >&2
echo "direct to terminal" > /dev/tty
$ ./writer.sh > /tmp/out 2> /tmp/err
direct to terminal
$ cat /tmp/out
standard output
$ cat /tmp/err
standard error
$