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)
请注意添加的括号.
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信号.