Как подавить предупреждения GtkDialog в zenity и yad с помощью перенаправления Bash в скрипте?

Как подавить предупреждения GtkDialog в zenity и yad с помощью перенаправления Bash в скрипте?

Я пытаюсь отключить GtkDialogпредупреждения в zenityи yad:

$ zenity --error --text hello
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Работает перенаправление и фильтрация ошибок:

$ zenity --error --text hello 2> >(grep -v GtkDialog >&2)

АГА...Надоедливое предупреждающее сообщение исчезло!!

Это можно поместить в ~/.bashrcразработку, как указано здесь:

и здесь:

Однако при создании скрипта для использования другими пользователями вы не хотите, чтобы им приходилось вносить изменения в свои файлы ~/.bashrc.


У меня возникли проблемы с созданием сочетания клавиш для:, 2> >(grep -v GtkDialog >&2)которое будет использоваться внутри скрипта.

По многим причинам назначение переменной GTK_SPAM="2> >(grep -v GtkDialog >&2)"с последующим ее использованием "$GTK_SPAM"не работает.

alias zenity="zenity 2> >(grep -v GtkDialog >&2)"до вызова скрипта работает, но я не могу использовать это внутри скрипта.

Использование массива для хранения сочетания клавиш не работает:

$ aGtkSpam=(2\> \>\(grep -v GtkDialog \>\&2\))

$ DumpArray "${aGtkSpam[@]}"
Array Elements:
0: 2>
1: >(grep
2: -v
3: GtkDialog
4: >&2)

$ zenity --error --text hello "${aGtkSpam[@]}"
This option is not available. Please see --help for all possible usages.

$ yad --text hello 2> >(grep -v GtkDialog >&2)

$ yad --text hello "${aGtkSpam[@]}"
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

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

Есть какие-нибудь подсказки?

решение1

Я не думаю, что один синтаксис может вам здесь помочь - из-за порядка, в котором оболочка устанавливает перенаправления и расширяет переменные. Вот очень простая иллюстрация:

$ arr=( ">" "/dev/null" )
$ set -x
$ echo foo "${arr[@]}"
+ echo foo '>' /dev/null
foo > /dev/null

т.е. все было развернуто «правильно», но > /dev/nullпросто стало списком строковых аргументов, переданных в echo.

Тымогоценка силы с использованием eval:

$ eval echo foo "${arr[@]}"
+ eval echo foo '>' /dev/null
++ echo foo

но на самом деле было бы лучше перенаправить поток на время выполнения вашего скрипта, используя exec:

exec 2> >(grep -v GtkDialog >&2)

или, если вы хотите иметь возможность отключить фильтр до окончания сценария, то на основеКак после использования exec 1>fileостановить перенаправление STDOUT в файл и восстановить нормальную работу STDOUT?это должно быть возможно сделать

exec 3>&2 2> >(grep -v GtkDialog >&2)

а потом позже

exec 2>&3 3>&-

для восстановления дублированного потока.

решение2

Вы можете определить и использовать псевдонимы в своем скрипте, если установите expand_aliasesопцию оболочки, например:

#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'

Теперь каждая zenityстрока ведет себя так, как будто 2> >(grep -v GtkDialog >&2)она была добавлена, и вы можете отключить это поведение, как обычно, добавив обратную косую черту или command:

\zenity        # and
command zenity

оба игнорируют псевдоним.

дальнейшее чтение

решение3

Вы можете использовать функцию в скрипте zenityи yadполучить полезную информацию в stdout, поэтому я предлагаю перенаправить просто stderr в/dev/null

#/bin/bash

zen_nospam() {
  zenity "$@" 2&>1 >(grep -v GtkDialog >&2)
}

zen_nospam --error --text hello

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

Связанный контент