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

Win*_*nix 3 command-line bash redirect

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

$ zenity --error --text hello
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Run Code Online (Sandbox Code Playgroud)

错误重定向和过滤工作:

$ zenity --error --text hello 2> >(grep -v GtkDialog >&2)
Run Code Online (Sandbox Code Playgroud)

是的...烦人的警告信息消失了!!

这可以放置在~/.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.
Run Code Online (Sandbox Code Playgroud)

我发现了许多关于分词和参数的优秀通用答案,它们应该可以解决我的问题,但我没有找到特定的语法。

有什么线索吗?

ste*_*ver 8

我不认为单独的语法可以帮助您 - 因为 shell 设置重定向和扩展变量的顺序。举一个非常简单的例子:

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

即一切都已“正确”扩展,但> /dev/null只是变成了传递给echo.

可以使用eval以下方法强制评估:

$ eval echo foo "${arr[@]}"
+ eval echo foo '>' /dev/null
++ echo foo
Run Code Online (Sandbox Code Playgroud)

但实际上最好使用exec以下命令在脚本持续时间内重定向流:

exec 2> >(grep -v GtkDialog >&2)
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望能够在脚本结束之前关闭过滤器,那么基于After using exec 1>file,我该如何停止 STDOUT 到文件的这种重定向并恢复 STDOUT 的正常运行?应该可以做

exec 3>&2 2> >(grep -v GtkDialog >&2)
Run Code Online (Sandbox Code Playgroud)

然后后来

exec 2>&3 3>&-
Run Code Online (Sandbox Code Playgroud)

恢复重复的流。


des*_*ert 7

如果您设置了expand_aliasesshell 选项,您可以在脚本中定义和使用别名,例如:

#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'
…
Run Code Online (Sandbox Code Playgroud)

现在每一zenity行都像2> >(grep -v GtkDialog >&2)添加一样,您可以像往常一样通过添加反斜杠或 来禁用此行为command

\zenity        # and
command zenity
Run Code Online (Sandbox Code Playgroud)

两者都忽略别名。

进一步阅读


Leo*_*Mew 6

您可以在脚本中使用函数。zenity并且yad在标准输出中有有用的信息,所以我建议只将标准错误重定向到/dev/null

#/bin/bash

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

zen_nospam --error --text hello
Run Code Online (Sandbox Code Playgroud)

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