即使我暂停第一个命令(Ctrl-z),也要依次运行一个命令


69

我知道在bash中我可以通过用分号将它们分开来依次运行一个命令,例如

$ command1; command2

或者,如果我只想command2command1成功的情况下运行,请使用&&

$ command1 && command2

这可以工作,但是如果我暂停command1使用Ctrl-z,则在第一种情况下,它将command2立即运行,而在第二种情况下,它根本不会运行。如何依次运行命令,但仍然能够挂起第一个命令,但是直到我重新启动它(使用fg)并完成后才能再次运行第二个命令?我希望输入的内容尽可能简单,因为我希望以交互方式进行输入。或者也许我只需要在某个地方设置一个选项。

顺便说一句,什么是正确的术语Ctrl-z


2
command1; command2应该正是您想要的。关于术语,Ctrl-Z暂停该过程。
NPE 2012年

嗯,事实并非如此。我4.2.8(2)-release在iTerm2的Mac OS X 10.8上运行bash版本。
asmeurer 2012年

感谢您的术语。我将更新问题以使用它。
asmeurer 2012年

是的,你是对的,事实并非如此。我认为您需要一个subshel​​l。看我的答案。
NPE 2012年

Answers:


95

请执行以下操作:

(command1; command2)

注意添加的括号。


5
太棒了!现在,你或任何人照顾给出一个解释,为什么它的行为方式是这样的这三种情况下(command1; command2command1 && command 2,和(command1; command2))?
asmeurer

2
其实我不确定。也许有人可以启发我们俩。
NPE 2012年

44
从技术上讲,您不会使用Control-z暂停进程,而是暂停job。使用command1; command2,活动作业只是command1按Control-z时的过程,因此它被挂起,下一个作业(command2)开始。使用(command1; command2),活动作业由运行两个命令的子外壳组成,因此整个子外壳由Control-z挂起。您可以通过jobs在挂起每个命令后运行命令来确认这一点。
chepner 2012年

感谢@chepner,该command1 && command2选项如何?那就是我经常遇到的。即使作业同时包含两个命令,我也注意到第二个命令在后台运行后不会执行。 (command1 && command2)当然可以,但是我经常不知道我想提前为流程做后台。否则,我将从一开始就将其作为后台作业执行。
mattgately 2014年

1
command1 && command2实际上是两个作业(一个作业包含一个管道,&&列表包含两个(单进程)管道,command1command2)。第二个命令直到command1退出(状态为零)后才运行,并且command1在停止时不退出。
chepner 2014年

11

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

逻辑“ AND”,&&的行为是从左到右进行测试。每个部分都必须成功,因此如果第一个部分不成功,那么第二个部分将无法运行。因此,使用&&可以从左到右运行命令,直到其中一个失败。成功的定义是退出代码($?)为零。

将此与逻辑“或” ||进行对比,后者从左至右运行命令,直到其中一个命令起作用为止。

@NPE提供的subshel​​l解决方案的说明也可以在以下man页面中找到:

'a;形式的复合命令和命令序列;b; 尝试中止进程时,不能很好地处理c'。当进程停止时,shell会立即执行序列中的下一个命令。只需在括号之间放置命令序列,以将其强制放入子外壳即可,该外壳可以作为一个单元停止。

CTRL + Z的合适术语是暂停字符,再次出现在man页面中:

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

(很抱歉引用这些man页面,但它们确实是您的朋友,值得一读)

如果您看一下,stty -a将会看到以下内容:

susp = ^Z; 

因此,您可以更改它,因此可以使用“通常”一词。但是不要这样做,这会使所有人困惑。终端驱动器发出SIGTSTP信号,该信号被Bash捕获。


我仍然不了解&&的行为。挂起进程是否会使它返回非零值?
asmeurer 2012年

这些是什么手册页?我想答案可能在那里,但我什至不知道从哪里开始。
asmeurer 2012年

&&连接两个管道,每个管道是一个单独的作业。(请注意,流水线是一个或多个由a联接的命令|,从command1技术上讲,它是单个单命令流水线)。
chepner 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.