【问题标题】:Show command when starting background process with cmd &使用 cmd & 启动后台进程时显示命令
【发布时间】:2019-01-17 08:52:23
【问题描述】:

我可以像这样启动一个后台进程:

>user@host ~ $ sleep 2m &
>[1] 123456

启动后台作业后立即显示作业号和 pid [1] 123456

开始工作后,我可以使用jobs -l检查其状态。

>user@host ~ $ jobs -l
>[1] 123456 Running sleep 2m &

当我像这样启动后台进程时,我希望看到jobs -l 的完整输出:

>user@host ~ $ sleep 2m &
>[1] 123456 Running sleep 2m &

我也会对这个命令感到满意,就像这样:

>user@host ~ $ sleep 2m &
>[1] 123456 sleep 2m &

我在手册页中查找了一些控制显示内容的环境变量,但还没有找到。这可能吗?如果可以,怎么做?

【问题讨论】:

  • 你说你想看到jobs -l的完整输出。这是否包括其他已经在运行的后台作业,或者只是您刚刚开始的那一项?
  • 什么时候有用?我会认为该命令很明显,因为它是您刚刚输入的那一行
  • @thatotherguy,在命令提示符下逐个输入命令的情况下,我明白你的意思——在这种情况下,这有点愚蠢。这是别名或团队共享的。他们没有写别名,所以他们不确定它启动了什么进程,只知道它有什么 PID,这没有意义。他们可以查看别名定义,或者自己调用jobs -l,但最好直接将这些信息交给他们。
  • @Barmar,不是其他工作,只是我开始的工作 - 很好的说明。
  • 你可以简单地做 sleep 30 & jobs -l %% 虽然它会打印两次 pid

标签: bash shell command environment-variables background-process


【解决方案1】:

您可以定义一个打印命令然后在后台执行它的函数。

mybg() {
    echo "Backgrounding: $@"
    eval "$@ &"
}

那么你可以这样做:

mybg sleep 60

【讨论】:

  • 这是一个好主意,可以工作,可惜不是全部在一条线上,但也许已经足够好了。我认为它会产生:>Backgrounding sleep 60>[1] 12345
【解决方案2】:

您可以通过使用 group 命令启动后台执行并重定向 group 命令的 stderr 来抑制初始 [1] 123456 输出。您可以立即发送jobs -l % 以打印您想要的关于放置在后台的最后一个命令的输出。

{ sleep 2m &} 2>/dev/null; jobs -l %

如果你关心你正在运行的作业的标准错误,你可以像这样扩展它:

{ sleep 2m 2>&3 &} 3>&2 2>/dev/null; jobs -l %

[技术来自this答案]

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2021-07-18
    • 2012-10-12
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多