2017-02-11 15 views
-2

Есть простой одиночная линия путь, или просто функция, что команда Баш:Условно перенаправить вывод Баш, только печать соиЬ и КВЖД на ошибки

  1. Трубы COUT и сегг к файлу по умолчанию на успех
    • Другими словами, не печатайте на терминале с успехом.
  2. При возникновении ошибки (то есть ненулевая возврат)
    • захвата код ошибки
    • печати файл из (1)
    • возвращения код ошибки
  3. Бонус: будет любовь, если я могу повторно включить печать по умолчанию с 1 или 2 символами

Мотивация: travis-ci имеет ограничение 4 Мбайт на общий размер журнала cout/cerr. Это убивает сборку, когда она превышена, поэтому я хотел бы печатать только фактические ошибки, но travis также заканчивается при обнаружении ошибки, как и set -e.

ответ

0

Я думаю, что вам нужно коснуться, как:

ls real_file.txt > /tmp/out.txt 2>&1 || echo $? && cat /tmp/out.txt 
ls non_existent.txt > /tmp/out.txt 2>&1 || echo $? && cat /tmp/out.txt 

Дополнение: после обратной связи OP в:

ls real_file.txt > /tmp/out.txt 2>&1 || (echo $? && cat /tmp/out.txt) 
ls non_existent.txt > /tmp/out.txt 2>&1 || (echo $? && cat /tmp/out.txt) 
+0

Это не появляется на работе, он не должен ничего об успехе печати: '○ echo "real_file_text"> real_file.txt' '○ cat real_file.txt> /tmp/out.txt 2> & 1 || echo $? && cat/tmp/out.txt' output: 'real_file_text' –

+0

Теперь я понял лучше. Тогда это должно сделать трюк: ls real_file.txt> /tmp/out.txt 2> & 1 || (echo $? && cat /tmp/out.txt) – arnaldocan

0

Как descibed в http://mywiki.wooledge.org/BashFAQ/106, вы можете применить глобальное перенаправление для всех команд.

Таким образом, вы можете начать свой скрипт так:

exec 3>&1 >log 2>&1 

С помощью этой команды, новый FD 3 будет присвоен экран, существовавший fd1 будет отправлена ​​в лог-файл и STDERR также будут отправлены в лог-файл ,

Дайте ему попробовать (или проверить мой тест here)

exec 3>&1 >log 2>&1 
ls nofile #This will raise an error on stderr 
echo "hello" #This would normally be printed on stdout/fd1 
echo "hello again" >&3 #This will go in fd3 
#Output: 
hello again 

$ cat log 
ls: cannot access nofile: No such file or directory                                
hello 

низкоспиновое провалится (если у вас есть файл с именем «nofile» :)), но сообщение об ошибке будет отправлено войти Gilė.

Эхо удастся распечатать «привет», но это перейдет к fd1, что снова означает файл журнала.

Последнее эхо перенаправляется на fd3 = ваш реальный экран, и это единственное сообщение, которое вы увидите в реальности.

На один шаг вперед вы можете захватить каждый результат команды с помощью $? (или используя массив bash PIPESTATUS, если вы собираетесь использовать каналы).

Другой тест:

exec 3>&1 >log 2>&1 
ls nofile; ex=$?; 
[[ "$ex" -ne 0 ]] && (echo "Oops, something gone wrong.Exit status = $ex" && cat log) >&3 

#Output 
Oops, something gone wrong.Exit status = 2 
ls: cannot access nofile: No such file or directory 

Альтернативный способ

if ! ls nofile;then echo "something is wrong" >&3;fi 

Если Ls выходит из строя, будет печатать «что-то не так» на экране
если Ls не обязательно будет печатать это результаты войти и вы ничего не видите на экране.

В качестве общей идеи с таким методом вы можете всегда перенаправлять stderr и stdout в файл, и вы можете выбирать, чтобы печатать сообщения на экране, применяя >&3 в каждой команде, которую вы хотите, чтобы ее результаты были напечатаны на вашем экран.

Я не знаю, возможно ли автоматическое перенаправление на основе статуса выхода каждой команды. Это то, что используется stderr. Чтобы печатать ошибки.

Кажется, что вам нужно контролировать статус выхода каждой команды после ее выполнения.

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

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

  • Нет связанных вопросов^_^