Я хотел бы упростить вывод сценария, подавив вывод вторичных команд, которые обычно успешны.
Тем не менее, использование -q
их скрывает вывод, когда они иногда терпят неудачу, поэтому у меня нет никакого способа понять ошибку. Кроме того, эти команды регистрируют свои выходные данные stderr
.
Есть ли способ подавить вывод команды только в случае успеха ?
Например (но не ограничиваясь этим) что-то вроде этого:
mycommand | fingerscrossed
Если все идет хорошо, fingerscrossed
ловит вывод и сбрасывает его. В противном случае он выводит его на стандартный вывод или вывод ошибки (что угодно).
scripting
error-handling
Матье Наполи
источник
источник
moreutils
. Во всяком случае,Это, вероятно, должно сработать. Он буферизует вывод каждого из них
command
в удаленный временный файл, а затем откачивает свой вывод в любой из них/dev/null
или в stderr в зависимости от того, был ли его статус возврата не нулевым. Поскольку временный файл удаляется досрочно, он не может быть прочитан каким-либо процессом, кроме текущей оболочки и ее дочерних элементов в дескрипторе файла (за исключением скрытого/proc/$pid/fd
отслеживания с соответствующими разрешениями) , и он не требует очистки по окончании.Возможно, более удобное решение для систем Linux:
... которые, в большинстве оболочек, так же, как другие работают, за исключение того, что вы можете назвать это как:
divert some simple-command with args
. Остерегайтесь высокопроизводительных команд в"$@"
, хотя дляdash
,yash
или в некоторых других оболочках, которые делают здесь - документы с каналами - я думаю, что в этих оболочках может быть возможно заполнить буфер канала (по умолчанию около 128 КБ в linux) и таким образом тупик , Это не должно быть беспокойства дляksh
,mksh
,bash
,zsh
, или Bourne оболочки, хотя - все те делают в основном то же самое, что я явно вышеexec
.источник
Обычно в случае ошибки команда выводит сообщения,
stderr
поэтому для вашей задачи вы можете просто подавитьstdout
источник
stderr
(так что это не имеет никакого эффекта).Сделать свой хронический
источник
Я делаю что-то подобное в моих make-файлах:
Адаптируя это к вашей ситуации, вы можете сделать что-то вроде этого:
Таким образом, «if» запускает команду и направляет вывод в mycommand.log. Если вам нужно поймать stdout vs stdout vs что угодно, вам может потребоваться изменить команду конвейера '&>' на '>'. Если команда не выполнена, запишите код ошибки, распечатайте содержимое файла mycommand.log, удалите файл mycommand.log и, наконец, верните исходный код ошибки.
Без (exit $ c) вы вернетесь с кодом выхода, который соответствует тому, что вернула команда 'rm'.
Наконец, если вы хотите один лайнер, что-то вроде этого будет работать.
источник
(...)
этом? Потому что это не делает ничего полезного для вас, но порождает дополнительные вложенные оболочки.(exit $c)
- это настройка$?
, которую вы не можете сделать иначе.if ! (mycommand) &>x
имеет смысл с перенаправлением, если команда использует, например,time
или выдает ошибку оболочки.{ ; }
завитки ... хотяexit
это немного сложно, по общему признанию.$?
вы можете просто использовать,exit $c
но да, в других случаях(exit $?)
имеет значение (хотя в целом функция оболочкиrret() { return $1; }
была бы лучше, я бы поспорил). Тем не менее, как показывает mikeserv, подоболочка для команд все еще не работает.Я просто нашел гораздо более простой ответ на этот другой вопрос :
Работает как шарм!
источник