LINUX.ORG.RU

Изменения вывода других утилит и нормальный --quiet в bash

 


0

3

Есть скрипт, использующий несколько сторонних утилит. Некоторые из них имеют опцию --quiet, у некоторых наоборот есть только --verbose, у некоторых вообще ничего нет. Вопросы следующие: 1. Как лучше запилить quiet-режим в скрипте? Был вариант записывать результат выполнения команд в переменную и выводить по надобности, но выглядит и работает такой вариант криво. 2. Как лучше изменить вывод других утилит? Ну, например, у меня есть:

I: Using Apktool 2.0.3 on .tempfile.temp
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources..
А я хочу, чтобы выводилось, например:
[ INFO ]: Using Apktool 2.0.3 on AWWW_SHIT_GAME.apk
[ INFO ]: Loading resource table...
[ INFO ]: Decoding AndroidManifest.xml with resources..



Последнее исправление: linuxedhorse (всего исправлений: 1)

1. command > /dev/null 2>&1
2. Через функцию-прослойку. Если скрипт системный, можно через системный логгер.

Kroz ★★★★★
()

по 2 могу подсказать, но думаю Вы знаете наверно, обработать вывод файла sed'ом

$ echo "I: "
I: 
$ echo "I: " | sed "s/I: /[ INFO ]:/"
[ INFO ]: 
NK ★★★★★
()
Последнее исправление: NK (всего исправлений: 1)
Ответ на: комментарий от Kroz

1. Но всё равно это везде у меня будут подобные конструкции:

if [[ $quiet = 1 ]; then
    command > /dev/null 2>&1
else
    command
fi

Или тут тоже предложишь создать функцию-прослойку?

linuxedhorse
() автор топика
#!/bin/bash

exec  >/tmp/stdout.log
exec 2>/tmp/stderr.log

...
anonymous
()
Ответ на: комментарий от NK

Да, это первое, что в голову приходит, но я надеялся, что есть какой-нибудь иной способ, потому что мне придётся тогда учитывать все варианты выводов всех используемых мною утилит. Можно, конечно, тупо подставлять в начало [ $MSG_TYPE ]: , но мне кажется это некрасивым решением. И как это сделать с выводом других утилит? Она может, в свою очередь, выдать сразу несколько сообщений.

linuxedhorse
() автор топика
Ответ на: комментарий от linuxedhorse

Что непонятного-то?

q() {
        if [ "$quiet" = 1 ]; then
                "$@" >/dev/null 2>&1
        else
                "$@" 2>&1 | sed -e 's|^|[INFO] |'
        fi
}

q ls -la
q rm -rf /
q shutdown -r now

Если нужно по-разному обрабатывать выводы разных команд, делаешь несколько разных q().

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от linuxedhorse

Или тут тоже предложишь создать функцию-прослойку?

Не обязательно

Например, переменную:

OUT_STREAM = ""

if [[ $quiet = 1 ]]; then
  OUT_STREAM = "> /dev/null 2>&1"
fi

command1 $OUT_STREAM
command2 $OUT_STREAM


А если в твой скрипт вообще вывод не предполагает, то так:
if [[ $quiet = 1 ]]; then
  1>/dev/null
  2>/dev/null
fi

command1
command2


А если направлять не в /dev/null, а через именованный пайп в какую-то функцию-обработчик, то можно вообще творить все что хочешь (например, что-то фильтровать, что-то как-то по-другому парсить, складывать в разные файлы и т. п.).

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.