2010-08-05 2 views
2

Я пишу скрипт bash, который по умолчанию хочу вывести все в файл журнала. Тем не менее, я также хочу, чтобы возможность выводить его на вызывающий терминал по запросу (например, параметр) INSTEAD из файла журнала (так что я думаю, что tee). Кто-нибудь знает простой способ сделать это?Перенаправить вывод сценария в файл журнала ИЛИ терминал по запросу

Было бы неплохо, если бы параметр мог быть произвольным файлом журнала или ссылкой на вызывающий терминал.

Я имею в виду вдоль линий этого: (псевдокод)

#!/bin/bash 

if [ ! $1 ]; then 
    OUT="default.log" 
else 
    OUT=$1 
fi 

#then do this to every call in the script 
commands [param] [param] >> ${OUT} 

Я думаю, больше того, что я спрашиваю, есть ли простой способ для ссылки на текущий терминал для выхода в? Так что я мог бы сделать ./script.sh, ./script.sh custom.log или script.sh TERMINAL?

ответ

4

Использование /dev/stdout в качестве имени файла сделает то, что вы хотите.

+0

Ах, это именно то, что я искал. Прошло некоторое время с тех пор, как я создал скрипты bash. (изменить: не удается принять ответ в течение 7 минут) – tj111

+2

Следует иметь в виду, что '/ dev/stdout' не находится в спецификации Single UNIX, версия 3. Более переносным выбором будет'/dev/tty', который находится в стандарт. –

3

я мог бы пойти с чем-то вроде этого:

#!/bin/bash 

if [[ $1 != --stdout ]]; then 
    exec >> "${1:-default.log}" 
fi 

commands [param] [param] 

Результат: Если пользователь передает --stdout то вывод идет в стандартный вывод, в противном случае она переходит в лог-файл. Пользователь может передать имя файла журнала в командной строке, и если он не укажет один, то по умолчанию он будет равен default.log.

Элемент exec хорош, потому что он перенаправляет весь будущий вывод из вашего скрипта. Это избавит вас от необходимости добавлять >> ${OUT} к каждой отдельной команде.

+0

О, спасибо, за это. Так много опрятных мелочей в bash, которые здорово использовать, но трудно найти. – tj111

+0

Это намного приятнее, но вам не нужно добавлять '--stdout' в аргументы строки exec? – grddev

+0

@grddev: Нет, это просто аргумент сценария. Не перенаправляя выход, он переходит в 'stdout', если скрипт передан' --stdout'. Если это не так, 'exec' отправит его в именованный файл или в' default.log', если имя не указано. –

Смежные вопросы