Скрытие вывода команды оболочки обычно включает в себя перенаправление stderr и stdout. Существуют ли какие-либо встроенные средства или команды, которые по умолчанию скрывают вывод, но при ошибке сбрасывают весь накопленный вывод? Я хотел бы запустить это в качестве оболочки для удаленных ssh
команд. Теперь я использую перенаправление, но не понимаю, что заставило их потерпеть неудачу, и они слишком многословны.
РЕДАКТИРОВАТЬ: В конце я создал следующий шаблон на основе ответа @Belmin, который я немного подправил, чтобы собрать все предыдущие команды из скрипта, использовать идентификатор текущего процесса, автоматически удалить журнал и добавить ошибку красного цвета. сообщение, когда что-то идет не так. В этом шаблоне начальные silent
обертки будут успешными, а затем не пройдут третью команду, потому что каталог уже существует:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
что-то вроде:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Ответы:
Я бы настроил функцию bash следующим образом:
Затем вы можете просто запустить команду:
источник
/etc/passswd
другой критический файл или перезаписывать содержимое.$* > /tmp/surpress.out 2>&1
Это действительно захватывает stderr.$*
не лучший способ справиться с произвольным вводом. Особенно, когда он содержит пробелы или флаги. Большинство портативных в${1+"$@"}
соответствии с stackoverflow.com/questions/743454/...Для этого должно быть достаточно просто написать скрипт.
Нечто подобное этому абсолютно непроверенному сценарию.
С другой стороны, для команд, которые я выполняю как часть сценария, я обычно хочу что-то лучше, чем просто выводить весь вывод. Я часто ограничиваю то, что вижу, неизвестным. Вот сценарий, который я адаптировал из того, что прочитал более десяти лет назад.
источник
Я не думаю, что есть чистый способ сделать это, единственное, о чем я могу думать, это
Реализация этого может быть интересным проектом, но, возможно, за пределами вопросов и ответов.
источник
шорт с чем-то вроде
tehcommand &>/tmp/$$ || cat /tmp/$$
зависит от того, сколько юзабилити / печатать вы хотите / нужно. (например, используя его как канал или передавая команду по аргументу)
Короткий скрипт @zoredache - это, по сути, прото-оболочка для этого, которая обеспечит большую надежность, обрабатывает параллелизм и т. д.
источник
Попробуй так:
источник
out="$(command args...)" || echo "$out"