我正在尝试抑制和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
我认为语法本身无法帮到你——因为 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
您可以在脚本中使用函数。zenity
并yad
在 stdout 中有有用的信息,所以我建议将 stderr 重定向到/dev/null
#/bin/bash
zen_nospam() {
zenity "$@" 2&>1 >(grep -v GtkDialog >&2)
}
zen_nospam --error --text hello
btw 函数可以在命令行中定义在 .bashrc 中,而不是脚本中