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

asm*_*rer 66 bash shell command signals suspend

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

$ command1; command2
Run Code Online (Sandbox Code Playgroud)

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

$ command1 && command2
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,什么是适当的术语Ctrl-z

NPE*_*NPE 92

以下应该这样做:

(command1; command2)
Run Code Online (Sandbox Code Playgroud)

请注意添加的括号.

  • 从技术上讲,您不使用Control-z暂停进程,而是暂停*jobs*.使用`command1; command2`,当您按下Control-z时,活动作业只是进程`command1`,因此它被挂起并且下一个作业(`command2`)开始.使用`(command1; command2)`,活动作业由运行两个命令的子shell组成,因此整个子shell被Control-z挂起.您可以通过在挂起每个命令后运行`jobs`命令来确认这一点. (41认同)
  • 真棒!现在,你或任何人都在关注为什么它对这三种情况的行为(`command1; command2`,`command1 && command 2`和`(command1; command2)`)? (4认同)
  • 实际上,我不确定.也许有人可以启发我们两个人. (2认同)

cda*_*rke 11

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

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

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

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

形式为'a;的复合命令和命令序列; b; 尝试进程暂停时,不会正常处理c'.当进程停止时,shell立即执行序列中的下一个命令.将命令序列放在括号之间就足以强制它进入子shell,这可以作为一个单元停止.

CTRL + Z的正确术语是暂停字符,再次来自man页面:

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

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

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

susp = ^Z; 
Run Code Online (Sandbox Code Playgroud)

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