
Я пытаюсь отключить 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, если это необходимо в командной строке, а не в скрипте.