2015-03-15 2 views
0

Я написал 2 методы ведения журналов в Баш скрипт, как:Printf Баш странное поведение

# Function to log information 
function print_info() { 
    format="$1" 
    shift 
    printf "$(date +'%F %T') ${SCRIPTNAME}: INFO: $format\n" "[email protected]" | tee -a ${LOGFILE}; 
} 

# Function to log error 
function print_error() { 
    format="$1" 
    shift 
    printf "$(date +'%F %T') ${SCRIPTNAME}: ERROR: $format\n" "[email protected]" | tee -a ${LOGFILE} >&2; 
} 

И определено несколько сообщений как:

BACKUP_DIR_INFO="All the contents of directory %s are compressed to %s." 
BACKUP_FILE_INFO="File %s is compressed at path %s." 
ERROR_FILE_NOT_EXIST="File or directory %s does not exist." 

Из моего сценария, я использую 2 выше методов, как показано:

function tarIt() { 
    FILE_NAME=$1 
    TAR_FILE_NAME=$2 
    if ! ([ -f $FILE_NAME ] || [ -d $FILE_NAME ]); 
    then 
    print_error $ERROR_FILE_NOT_EXIST $FILE_NAME 
    else 
    if [[ -f $FILE_NAME ]] 
    then 
     print_info "$BACKUP_FILE_INFO" "$FILE_NAME" "$BACKUP_DIR" 
    else 
     print_info "$BACKUP_DIR_INFO" "$FILE_NAME" "$TAR_FILE_NAME" 
    fi 
    fi 
} 

я назвал функцию tarIt дважды с 2-мя именами файлов, из одного существовать d другой не существует, но получает выход, как показано ниже:

2015-03-15 09:42:46 : ERROR: File 
2015-03-15 09:42:46 : INFO: All the contents of directory /opt/mgtservices/relay/logs are compressed to /root/backup/relay_logs.tar.gz. 

Строка с ошибкой не печатается полностью.

Не получить причину. Даже я пытался использовать метод print_error для других сообщений, но только первое слово строки, которое он печатает. Позже она игнорируется.

+6

Укажите свои переменные! 'print_error $ ERROR_FILE_NOT_EXIST $ FILE_NAME' →' print_error "$ ERROR_FILE_NOT_EXIST" "$ FILE_NAME" и т. д. Могу ли я рекомендовать использовать http://www.shellcheck.net? – Biffen

ответ

2

Как сказал @Biffen в комментарии, поставьте двойные кавычки вокруг всех переменных ссылок. Когда эта команда работает:

print_error $ERROR_FILE_NOT_EXIST $FILE_NAME 

Оболочка расширяет его:

print_error File %s is compressed at path %s. /path/to/nonexistent/file 

... и поэтому функция print_error получает «Файл» в $ 1, использует это в качестве строки формата, и вы получите бессмысленный выход. Кстати, также неплохо вставлять данные (дату и имя сценария) в строку формата; использовать %s и добавить их в разделе полей:

printf "%s %s: INFO: $format\n" "$(date +'%F %T')" "$SCRIPTNAME" "[email protected]" | tee -a "$LOGFILE" 

Обратите внимание, что я взял на себя смелость дважды цитировании ссылка на $ LOGFILE. Пожалуйста, привыкнуть помещать ссылки переменных в двойные кавычки, если нет особых причин.

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