如何使用脚本中的 Bash 重定向来抑制 zenity 和 yad 中的 GtkDialog 警告?

如何使用脚本中的 Bash 重定向来抑制 zenity 和 yad 中的 GtkDialog 警告?

我正在尝试抑制和GtkDialog中的警告:zenityyad

$ 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

我认为语法本身无法帮到你——因为 shell 设置重定向和扩展变量的顺序不同。举一个非常简单的例子:

$ 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

如果你设置了 shell 选项,则可以在脚本中定义和使用别名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

您可以在脚本中使用函数。zenityyad在 stdout 中有有用的信息,所以我建议将 stderr 重定向到/dev/null

#/bin/bash

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

zen_nospam --error --text hello

btw 函数可以在命令行中定义在 .bashrc 中,而不是脚本中

相关内容