先有鸡还是先有蛋的情况:后台 运行 命令的功能
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
- 调用后命令行被锁定
- 按 Enter 键得到新的空行
- 按
[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 &)
}
我担心这可能是重复的,但我找不到匹配的问题。
我主要在命令行上工作。如果我只想打开一个 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
- 调用后命令行被锁定
- 按 Enter 键得到新的空行
- 按
[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 &)
}