Bash:运行一个接一个的命令,即使我暂停第一个(Ctrl-z)

我知道在bash中我可以运行一个接一个的命令,用分号分隔它们

$ command1; command2 

或者,如果我只想command2只有在command1成功运行,使用&&

 $ command1 && command2 

这是有效的,但是如果我使用Ctrl-z暂停command1 ,在第一种情况下,立即运行command2 ,在第二种情况下,它根本不运行。 我怎样才能顺序运行命令,但仍然能够暂停第一个命令,但没有第二次运行,直到我已经重新启动它(与fg ),它完成? 我希望尽可能简单的input内容,因为我希望以交互方式进行此操作。 或者,也许我只需要在某个地方设置一个选项。

顺便说一下, Ctrl-z是什么?

以下应该做到这一点:

 (command1; command2) 

请注意添加的括号。

在Bash中,当你把工作放到后台(使用CTRL + Z或者&)时,它不会等待工作完成,并且退出代码为0(成功)。 你已经注意到了这一点,并在man页中有logging。

逻辑“AND”,&&的行为是从左到右进行testing。 每个部分都必须成功,所以如果第一部分不成功,那么第二部分不会运行。 所以用&&它从左到右运行命令,直到其中一个失败。 成功的定义是零的退出码($?)。

将其与逻辑“OR”(||)进行对比,它从左向右运行命令,直到其中一个工作

@NPE给出的subhell解决scheme的解释也可以在man页find:

复合命令和forms为'a; b; 当尝试暂停进程时,c'不能正常处理。 当进程停止时,shell立即执行序列中的下一个命令。 只需在括号之间放置命令序列即可将其强制为一个子shell,它可以作为一个单元停止。

CTRL + Z的正确名称是暂停字符,同样来自man页:

在进程运行时键入暂停字符(通常是^ Z,Control-Z)会导致该进程停止并将控制权返回给bash。

(抱歉引用这么多的man ,但他们真的是你的朋友,值得一读)

如果你看stty -a你会看到这样的东西:

 susp = ^Z; 

所以你可以改变它,因此,“典型”的短语。 不要这样做,它会混淆每一个人。 terminal驱动程序产生一个由Bash捕获的SIGTSTP信号。

假设你有五个bash命令,并且你一个接一个地运行。 一旦你validation命令运行良好,你暂停了CTRL + Z。

如果你在nohup模式下运行你的脚本,那么不要紧,你按下ctrl + Z

nohup bash abc.sh