11

我经常从一个 shell(在我的例子中是 Bash)命令中执行我想立即分叉并且我想忽略其输出的命令。事实上,我经常创建一个脚本 ( silent) 来执行此操作:

#!/bin/bash
$@ &> /dev/null &

然后我可以运行,例如

silent inkscape myfile.svg

而且我的终端不会被我刚刚分叉的进程的调试输出所污染。

我有两个问题:

  1. 是否有这样做的“官方”方式?即更短但相当于&> /dev/null &

  2. 如果没有,有没有办法可以在我的silent命令之后使制表符完成工作,就好像它不存在一样?举个例子,在我输入 之后silent inksc,我希望 bashsilent inkscape在我按下 时自动完成我的命令[tab]

4

4 回答 4

4

旁白:可能希望exec "$@" &> /dev/null &在您的silent脚本中,使其丢弃子外壳,并且周围的引号"$@"将防止空格妨碍。

至于#2:complete -F _command silent应该做一些你想要的事情。(我调用我的那个脚本版本launchcomplete -F launch在我的.bash_profile

于 2011-12-08T15:50:26.693 回答
3

看起来 nohup 或多或少地做了你想要的。制表符补全问题是因为 bash 认为您正在尝试补全文件名作为脚本的参数,而它的补全规则知道 nohup 将命令作为其第一个参数。

Nohup 将 stout 和 stderr 重定向到 nohup.out,并且如果您的 shell 退出,该命令也会继续运行。

于 2011-12-08T23:11:40.307 回答
2

这是我用来从例如 xterm 启动交互式(和健谈)X 应用程序的小脚本

#!/bin/bash
exe="$1"
shift
"$exe" "$@" 2>/tmp/$$."$exe".err 1>&2 & disown $!

没有输出,如果终端退出也不会死,但如果出现问题,/tmp 中会记录所有输出

如果您不想要日志,只需使用 /dev/null 。

如果您对脚本过敏,也可以使用函数。

于 2011-12-08T17:39:23.283 回答
0

也许您可以“重新绑定”制表键?显示了使用 enter 键的超级用户 Stackoverflow的示例。这是正确的想法吗?

于 2011-12-08T15:44:44.783 回答