即使我暂停第一个命令,也可以一个接一个地运行一个命令(Ctrl-z)

时间:2012-11-28 07:53:57

标签: bash shell command signals suspend

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

$ command1; command2

或者,如果我只希望command2仅在command1成功时才能投放,请使用&&

$ command1 && command2

这样可行,但如果我使用command1暂停Ctrl-z,则在第一种情况下,它会立即运行command2,而在第二种情况下,它根本不会运行fg 。我如何按顺序运行命令,但仍然可以暂停第一个命令,但是在我重新启动它之前没有第二个命令(使用Ctrl-z)并且它完成了?我更喜欢尽可能简单的输入,因为我想以交互方式进行此操作。或者我可能只需要在某个地方设置一个选项。

顺便说一下,{{1}}做什么的正确用语是什么?

2 个答案:

答案 0 :(得分:90)

以下应该这样做:

(command1; command2)

请注意添加的括号。

答案 1 :(得分:11)

在Bash中,当您将作业放入后台时(使用CTRL + Z或&),它不会等待作业完成,并且退出代码为零(成功)。您已经观察到了很多,并且已在man页面中进行了记录。

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

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

@NPE给出的子shell解决方案的解释也可以在man页面中找到:

形式'a;的复合命令和命令序列; b; c'不是 在尝试进程暂停时优雅地处理。当进程停止时,shell立即执行序列中的下一个命令。将命令序列放在括号之间就足以将其强制转换为子shell,子shell可以作为一个整体停止。

CTRL + Z的正确用语是 suspend 字符,同样来自man页面:

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

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

如果你看stty -a,你会看到类似的东西:

susp = ^Z; 

所以你可以改变它,因此短语“通常”。不要这样做,它会让每个人都感到困惑。终端驱动程序引发了由Bash捕获的SIGTSTP信号。