2

Я хотел бы написать функцию, которая пишет сообщение как в консоль, так и в файл журнала. Моя первая попытка была такой:

function log_write {
    local message=$1
    local log_file=$2
    echo "${message}" | tee -a ${log_file}
}

Но это не работает - я думаю, потому что эхо в контексте функции означает «вернуть значение», а не записывать в консоль. Что я упустил? Я вызываю это так в моем сценарии:

message='something interesting happened'
log_file='my_script.log'
$(log_write $message $log_file)

Кроме того, я запускаю его на Windows через порт msysgit, но я удваиваю, что проблема.

1 ответ1

5

Синтаксис подстановки команд является проблемой здесь:

$(log_write $message $log_file)

Это вызывает функцию и возвращает вывод, готовый быть записанным в переменную. Однако вы этого не делаете.

Вместо этого вы хотите вызвать вашу функцию, как и любую другую команду:

log_write "$message" "$log_file"

Обратите внимание на кавычки: они имеют решающее значение, чтобы сообщения из нескольких слов содержались в качестве единого аргумента. В противном случае, если вы сделаете это:

message="hello world"
log_write $message $log_file

Затем вы получите слово "привет", записанное в файл "world". Это происходит из-за разделения слов после раскрытия переменной. Правило большого пальца: всегда заключайте в кавычки ваши переменные, кроме случаев, когда вы явно хотите, чтобы разделение слов и эффекты расширения имени файла исключали кавычки. Есть также последствия для безопасности при пропуске кавычек

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .