2013-09-18 2 views
1

Прежде всего, извините за мой плохой английский.Добавить режим отладки в сценарий bash

Я хочу enbale отлаживать режим, с датой. Я thinkging в переменной, которые используют один тип перенаправления, или другой, как это:

#!/bin/bash 

DEBUG_MODE=1 

if [ $CHAMAC_DEBUG = 0 ]; then 
output=/dev/null 
elif [ $CHAMAC_DEBUG = 1 ]; then 
output=>(while read line; do echo "$(date): ${line}"; done >> ~/output.log) 
fi 

echo "hi, im a echo" &> $output 

Но не работают для меня .... как можно сделать it¿ ¿?

ответ

0

Ваш вопрос трудно понять, но, возможно, вы ищете что-то вроде этого?

debug() { 
    date +"[%C] $*" >&2 
} 

if ... whatever ...; then 
    dbg=debug 
else 
    dbg=: 
fi 

$dbg "script started" 
: 

Везде, где вы хотите вывести диагностический, используйте $dbg вместо echo.

(Вы должны удвоить любой буквальный знак процента в отладочных принтами, или сделать функцию немного сложнее.)

0

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

#!/bin/bash 

function print_debug { 
    [ $DEBUG_MODE -eq 1 ] && echo "$(date) $1" 
} 

DEBUG_MODE=0 
print_debug "Test 1" 
DEBUG_MODE=1 
print_debug "Test 2" 

выход:

$ ./test.sh 
Test 2

вы могли бы также отдельный отладочный вывод из Регул выход ар путем вторя отладочные сообщения на другой дескриптор файла:

function print_debug { 
    [ $DEBUG_MODE -eq 1 ] && echo "$1" 1>&3 
} 

Таким образом, вы можете перенаправить STDOUT, STDERR и отладочный вывод в различные файлы, если это необходимо.

0

Вы можете использовать альтернативный файловый дескриптор для этого (вместе с несколькими другими исправлениями):

if [[ "${CHAMAC_DEBUG}" == "1" ]] 
then 
    exec 3>> ~/output.log 
else 
    exec 3>> /dev/null 
fi 

{ echo "$(date) : hi, im a echo"; } >&3 

Процесс синтаксиса замена хочет видеть название программы, а не bash внутреннюю команду как while. Вы могли бы заставить его работать, используя что-то вроде >(bash -c 'some stuff here'), но, как мне кажется, это проще. Единственным недостатком является то, что вам нужно сделать свою собственную штамповку даты. Если это проблема, вы можете изучить отправку отладочных сообщений на syslog (через logger) и настроить это, чтобы сбрасывать эти конкретные сообщения в собственном файле. ..

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