Я пытаюсь подавить 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.
Я нашел много отличных общих ответов о разбиении слов и параметрах, которые должны ] решить мою проблему, но особый синтаксис ускользает от меня.
Есть какие-нибудь подсказки?
Я не думаю, что один только синтаксис может помочь Вам здесь - из-за порядка, в котором оболочка настраивает перенаправления и разворачивает переменные. Приводить очень простой пример:
$ 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>&-
восстановить дублированный поток.
Вы можете использовать функцию в скрипте. 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]
Вы можете определить и использовать псевдонимы в своем скрипте, если вы установите опцию оболочки 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
оба игнорируют псевдоним.