【问题标题】:Refere to jobs in sh参考sh中的jobs
【发布时间】:2017-03-16 03:59:06
【问题描述】:

在 bash 中,我可以使用 %+ 或 %% 引用上一份工作,但在 /bin/sh 中我不能这样做。

考虑以下脚本:

#!/bin/[ba]sh

some_job() {
    sleep 1
    sleep 1
    sleep 1
    sleep 1
    sleep 1
    sleep 1
}

some_other_job() {
    sleep 1
}

echo "some_job"
some_job &

echo "some_other_job"
some_other_job &

echo "sleep"
sleep 2

kill %1

jobs -l

用bash 运行它没问题,但是用sh 运行它会给我一个错误。

$ ./mwe.sh
some_job
some_other_job
sleep
./mwe.sh: 25: kill: No such process

[2] + 2446 Done
[1] + 2445 Running
$ ps
  PID TTY          TIME CMD
 2445 pts/0    00:00:00 mwe.sh
 2453 pts/0    00:00:00 sleep
 2494 pts/0    00:00:00 ps
 3587 pts/0    00:00:01 zsh

如何参考/bin/sh 中的职位?

【问题讨论】:

    标签: bash shell sh jobs


    【解决方案1】:

    更新:POSIX kill 确实 accept job ids;他们只是在概要中没有提到。 Leon's answer 也是正确的。


    POSIX kill 仅适用于进程 ID,不适用于作业规范。您必须明确记录要终止的作业的进程 ID。

    # [ function definitions deleted.]
    
    echo "some_job"
    some_job & to_kill=$!
    
    echo "some_other_job"
    some_other_job &
    
    echo "sleep"
    sleep 2
    
    kill "$to_kill"
    
    jobs -l
    

    【讨论】:

      【解决方案2】:

      尝试通过以下方式之一启用作业控制:

      1. 将您的 shebang 线路更改为 #!/bin/sh -m
      2. 将 set -m 添加为脚本的第一个命令

      这两种方法都对我有用(使用dash 作为/bin/sh)。

      【讨论】:

        【解决方案3】:

        据我所知,原版 Bourne Shell 不支持作业控制。

        【讨论】:

        • 这是否意味着我以& 开头的所有内容都“失控”了?
        • 应该假设/bin/sh 指的是POSIX shell,而不是Bourne shell。
        • 正如 chepner 所说——Bourne 是 1970 年代的外壳。 POSIX sh,建立于 90 年代,是一个更新的标准:如果现代 shell 是 Bourne 的超集,echo foo ^ cat 将在标准输出上发出foo,而不是foo ^ cat——就像在 Bourne 中一样,与 POSIX sh 不同,@987654326 @ 是一个竖线字符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 2010-11-02
        相关资源
        最近更新 更多