先有鸡还是先有蛋的情况:后台 运行 命令的功能

Chicken-And-Egg-Situation: Function for running commands in the background

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

我主要在命令行上工作。如果我只想打开一个 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 &

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

(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 的联机帮助页中说:

When bash starts a job asynchronously (in the background), it prints a line that looks like:

[1] 25647  

indicating that this job is job number 1 and that the process ID of the last process in the pipeline associated with this job is 25647. All of the processes in a single pipeline are members of the same job. Bash uses the job abstraction as the basis for job control.

@Dimitre Radoulov 在 this other SO post 中说:

you could supress that output by putting the call in a subshell:

(echo "Hello I'm a background task" &)

因此,为了避免作业编号和进程 ID 输出行,您应该像这样更改您的函数:

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