Записать в терминал после перенаправления stdout в файл без использования stderr? - PullRequest
7 голосов
/ 23 февраля 2012

У меня есть два сценария оболочки, один из которых служит главной «программой», а другой - «библиотекой».

В некоторых местах в «программе» я сделаю что-то вроде: log "$thing" >> "$logfile", где log - это функция, определенная в «библиотеке».

# program.sh

logfile="log.txt"
stuff="hahah heheh hoho"

. library.sh 

for thing in $stuff; do
  log "$thing" >> "$logfile"
done

Myвопрос: есть ли способ перенаправить некоторые выходных данных из функции обратно на терминал без , используя 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 ]

12 голосов
/ 23 февраля 2012

Открыть /dev/tty на другом FD.

exec 0< /dev/null
exec 1> /dev/null
exec 2> /dev/null
exec 3> /dev/tty
echo 'Hello, World!' >&3 
8 голосов
/ 23 февраля 2012

Вы можете писать напрямую на /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
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...