从 raring 升级后,我在 trusty 上运行了很棒的窗口管理器。我的桌面环境故意没有运行所有的 Gnome / Freedesktop 守护进程——我不想要它们。
当我gedit
从这样的终端执行时:
gedit file
每当我按下 enter 或 save 或在其他各种情况下,它都会在我的终端上输出这样的消息:
(gedit:5700): Gtk-WARNING **: Calling Inhibit failed: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.SessionManager was not provided by any .service files
我明白这个警告的意思,我决定这对我来说无关紧要。
我怎样才能关闭这种警告?通过“关闭”,我并不是指任何这些或类似的解决方法:
- 将 gedit 的输出通过管道传输到
/dev/null
- 编写一个包装器脚本,将 gedit 的输出通过管道传输到
/dev/null
- 创建一个别名,将 gedit 的输出传送到
/dev/null
这些变通办法是不可接受的,因为它们必须单独应用于每个 Gnome 应用程序——gedit 并不是唯一喜欢弄乱终端的应用程序。
首先,我还发现这些警告出现在开箱即用的 Ubuntu 上很烦人,没有我能找到的禁用它们的“正确”方法(似乎最常见的“解决方案”是安装
gir1.2-gtksource-3.0
这似乎不起作用,因为它已经安装,或者忽略它们 - 但我想完全抑制它们,因为它们只会让我的终端嘈杂)。我想出了以下代码,到目前为止它的行为似乎完全符合我的预期,并且基于 TuKsn 的回答,但对其进行了一些增强:
gedit ...
),无需使用 F12 或其他快捷方式(调用未过滤的使用/usr/bin/gedit ...
)。仍然可以概括一点,但就目前而言,如果您需要对其他命令进行相同的处理,请
gedit()
为每个需要相同过滤器的命令名称复制该函数。还有一个更好的版本(更小,完全通用,不需要重写历史,因为按原样调用,并且更好地过滤每行而不是整个输出):
这也是一种解决方法,但您不必为每个应用程序都应用它。
将此写给您
.bashrc
,您可以将此包装器与 F12(或选择另一个键)一起使用来抑制警告:我实际上用 C 编写了hide-warnings 工具,我发现它比上面显示的脚本更容易使用。此外,它将写入所有
stdout
默认写入的输出(因为 Gtk 和其他警告被发送到,stderr
所以默认情况下它stderr
不解析stdout
)。上面脚本的一个大问题是它不会向您的控制台写入任何内容,即使它与正则表达式不匹配,直到完成。这是因为它将所有数据保存在一个变量中,然后在完成后 grep 该变量。这也意味着它会将输出保存在该变量中,可能会使用大量内存(至少您应该将其保存在临时文件中。)最后,据我所知,如果任何一行匹配,grep 将阻止任何显示. 也许不完全是你想要的。
该工具可以像这样在一个简单的别名中使用:
(我用
gvim
……我相信它也能用gedit
。)该文件是自包含的,除了 C 库之外没有依赖项,因此您可以获得一个副本并轻松编译和安装它:
该文件中有一些进一步的文档,您可以使用
--help
编译后的快速文档。较新的版本,在某些时候将使用 advgetopt 库,是在 C++ 中。
我一直在寻找一种实用程序来解决这类问题,我自己。
我对所提供答案的问题如下:
我很欣赏我所看到的使用 Bash 进行此操作的尝试,但是,我未能找到一种解决方案来满足上述所有 3 个条件。
我的最终解决方案是用 NodeJS 编写的,我知道它不会安装在许多 linux 机器上。在选择编写 JS 版本之前,我尝试用 python 编写代码,发现异步 IO 库非常丑陋且损坏,直到非常新的 python 版本(~3.5 在一些较新的发行版上开箱即用)。
最小化依赖性是选择 python 的唯一原因,所以我放弃了它而选择了 NodeJS,它有一组非常好的库,用于一些低级的、面向异步的 IO。
这里是:
要使用此脚本,您可以将这些行添加到您的 .bashrc 中:
您选择运行的子进程将继承标准输入,因此您可以自由使用 BASH 管道或重定向。
一种解决方案是创建一个函数来抑制 Gtk 错误消息。
有时,错误的来源并不明显。
例如,如果您的 .gitconfig 中有以下内容,它告诉 git 使用meld 作为 git difftool:
然后您尝试比较您的.bashrc文件:
你可能会收到很多恼人的 Gtk 错误消息:
创建一个函数,将您的输出和 stderr 重定向到 /dev/null
现在,当您运行 时
git-difftool .bashrc
,您将不会再看到 Gtk 错误消息。一个附带的好处是,通过在git-difftool函数的定义中添加 & 控制运算符,您可以在后台运行此命令,这将释放您的终端 st,您可以在 meld difftool 窗口中运行其他命令.