我知道在bash中我可以通过用分号分隔它们来运行一个接一个的命令,比如
$ command1; command2
或者,如果我只希望command2
仅在command1
成功时才能投放,请使用&&
:
$ command1 && command2
这样可行,但如果我使用command1
暂停Ctrl-z
,则在第一种情况下,它会立即运行command2
,而在第二种情况下,它根本不会运行fg
。我如何按顺序运行命令,但仍然可以暂停第一个命令,但是在我重新启动它之前没有第二个命令(使用Ctrl-z
)并且它完成了?我更喜欢尽可能简单的输入,因为我想以交互方式进行此操作。或者我可能只需要在某个地方设置一个选项。
顺便说一下,{{1}}做什么的正确用语是什么?
答案 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信号。