【问题标题】:Chicken-And-Egg-Situation: Function for running commands in the backgroundChicken-And-Egg-Situation:在后台运行命令的功能
【发布时间】:2021-12-10 19:42:25
【问题描述】:

我担心这可能是重复的,但我找不到匹配的问题。

我主要在命令行上工作。如果我想简单地打开一个 pdf 文件,我想保持我的实际命令行工作并且不会被任何输出淹没。

一般

evince my_file.pdf </dev/null &>/dev/null &

确实可以...但是打字不是很方便。所以我尝试添加一个功能:

function exec_in_background_silent() {
    "$@" </dev/null &>/dev/null &
}

这种方法的目的是分离运行传递的命令......但这样调用它:

exec_in_background_silent evince my_file.pdf

让我再次松开命令行,因为我认为现在它等待函数本身完成:(

如果我添加另一个&符号,它会非常好:

exec_in_background_silent evince my_file.pdf &amp;

但是:有没有办法摆脱它?

(evince 可能是一个不好的例子,因为它不是很健谈……但还有其他的 ;))

编辑了解更多详情:

我正在运行 Ubuntu

echo "${BASH_VERSION}"
5.0.17(1)-release
  1. 调用后命令行被锁定
  2. 按 Enter 获得新的空行
  3. [strg]+[c] 会给出以下输出并终止 evince
exec_in_background_silent evince my_file.pdf
[1] 12234







^C
[1]+  Fertig                   < /dev/null &> /dev/null

【问题讨论】:

  • 奇怪!您的功能在我的 bash 中完美运行。我们可以比较一下吗?
  • 该函数不等待后台命令,它立即完成。所以主shell在等待时不应该延迟。
  • 也许正在执行“screen -d -m evince my_file.pdf”?
  • 在上面添加了一些细节。 @masterguru:给定的屏幕命令示例的行为方式完全相同:如果直接调用它可以正常工作,但会在函数内部中断。
  • @roccobaroccoSC 你是对的。在另一台计算机上它工作正常!

标签: bash function redirect detach


【解决方案1】:

在 bash 的联机帮助页中,它说:

当 bash 异步启动作业时(在后台),它会打印一个 看起来像这样的线:

[1] 25647  

表示此作业是作业编号 1,并且与此关联的管道中的最后一个进程的进程 ID 作业是 25647。单个管道中的所有进程都是 同样的工作。 Bash 使用作业抽象作为作业的基础 控制。

而@Dimitre Radoulov 在this other SO post 中说:

您可以通过将调用放在子外壳中来抑制该输出:

(echo "你好我是后台任务" &)

所以,为了避免作业号和进程 ID 输出行,你应该像这样改变你的函数:

function exec_in_background_silent() {
    ("$@" </dev/null &>/dev/null &)
}

【讨论】:

  • 非常感谢。这确实甚至抑制了工作ID(到目前为止我什至不介意)。我很好奇这是否能解决我另一台机器上的问题......但由于它在这台机器上的工作效果更好,我很乐意接受答案:)
猜你喜欢
  • 2018-03-17
  • 2023-03-13
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多