为什么我不能在bash脚本中使用作业控制?

this answer到另一个 question,我被告知

in scripts you don’t have job control
(and trying to turn it on is stupid)

这是我第一次听到这个,我已经在工作控制(第7章)的bash.info部分,找到没有提到任何一个断言。 [更新:手册页有点更好,提到’典型’使用,认设置和终端I / O,但没有真正的原因为什么作业控制是特别不明智的脚本。

那么,为什么不基于脚本的作业控制工作,什么使它成为一个坏的做法(又名“愚蠢”)?

编辑:有问题的脚本启动后台进程,启动第二个后台进程,然后尝试将第一个进程放回前台,使其具有正常的终端I / O(如果直接运行),然后可以重定向外面的脚本。不能做到后台进程。

正如accepted answer到另一个问题所指出的,存在其他脚本来解决这个特定的问题,而不尝试作业控制。精细。而lambasted脚本使用硬编码的工作号码 – 显然不好。但我想了解工作控制是否是一个根本注定的方法。它仍然似乎也许它可以工作…

他的意思是,作业控制认在非交互模式下关闭(即在脚本中)。

从bash手册页:

JOB CONTROL
       Job  control refers to the ability to selectively stop (suspend)
       the execution of processes and continue (resume) their execution at a
       later point.
       A user typically employs this facility via an interactive interface
       supplied jointly by the system’s terminal driver and bash.

set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
      ...
      -m      Monitor mode.  Job control is enabled.  This option is on by
              default for interactive shells on systems that support it (see
              JOB CONTROL above).  Background processes run in a separate
              process group and a line containing their exit status  is
              printed  upon  their completion.

当他说“很蠢”时,他的意思不仅是:

>是作业控制,主要用于促进交互式控制(而脚本可以直接与pid的工作),但也
>我引用他的原始答案,…依赖于你没有开始任何其他工作以前在脚本中这是一个坏的假设。这是相当正确的。

更新

在回答你的评论:是的,没有人会阻止你使用作业控制在你的bash脚本 – 没有硬的情况下强制禁用set -m(即是,从脚本的作业控制将工作,如果你想它。 )记住,最后,特别是在脚本中,总是有不止一种方法来皮肤一只猫,但一些方法更便携,更可靠,使处理错误情况,解析输出更简单等。

您特定的情况可能或可能不会保证与lhunath(和其他用户)认为“最佳实践”不同的方式。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...