Я хочу зафиксировать и записать свою ошибку в файл журнала вместе с пользовательским сообщением.

Рассмотрим команду:

$(find $val -type f -delete) || echo "error in deleting files" |tee -a log.txt

Эта команда записывает строку ниже в файл log.txt

error in deleting files

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

find: `/home/temp': No such file or directory
error in deleting files
2
ETL_Devs 22 Май 2020 в 12:38
1
Вы уже видели этот ответ? Было бы полезно полностью понять ||
 – 
Francesco Lucianò
22 Май 2020 в 12:47
Да, я проверил этот ответ, но я не могу обойти передачу stderr для альтернативной команды, используя || команда. он никогда не печатает его в файл. он просто выводит его на консоль, я могу использовать >&2, чтобы передать его в файл, но я хотел передать его команде tee для единой структуры большого сценария оболочки
 – 
ETL_Devs
22 Май 2020 в 12:56

1 ответ

Лучший ответ

Вам нужно изменить приоритет операторов там и сгруппировать команды find || echo в составную команду, перенаправленную в канал на tee:

{ $(find $val -type f -delete) || echo "error in deleting files"; } 2>&1 |tee -a log.txt

Или также:

($(find $val -type f -delete) || echo "error in deleting files") 2>&1 |tee -a log.txt

Перенаправление 2>&1 служит для перенаправления сообщений об ошибках find в канал, читаемый tee, в то время как вывод echo уже естественным образом попадает в этот канал.

3
LL3 22 Май 2020 в 13:31
О, я пытался перенаправить 2>&1, а затем вывести стандартный вывод в журнал с сообщением, но это лучше, спасибо
 – 
ETL_Devs
22 Май 2020 в 14:01