Как подавить предупреждения 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.

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

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

2
задан 18 May 2019 в 13:31

3 ответа

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

$ 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>&-

восстановить дублированный поток.

8
ответ дан 18 May 2019 в 13:31

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

#/bin/bash

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

zen_nospam --error --text hello

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

0
ответ дан 18 May 2019 в 13:31

Вы можете определить и использовать псевдонимы в своем скрипте, если вы установите опцию оболочки 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

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

Дополнительная литература

0
ответ дан 18 May 2019 в 13:31

Другие вопросы по тегам:

Похожие вопросы: