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)
我发现了许多关于分词和参数的优秀通用答案,它们应该可以解决我的问题,但我没有找到特定的语法。
有什么线索吗?
我不认为单独的语法可以帮助您 - 因为 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)
恢复重复的流。
如果您设置了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)
两者都忽略别名。
您可以在脚本中使用函数。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 中定义,如果需要在命令行中定义,而不是脚本