Bash作业控制 - 你可以在列表上终止第二个命令而不先终止吗?

时间:2011-10-24 17:55:16

标签: bash background-process job-control

如果我在bash提示下发出此消息:$ cmd_1; CMD_2

cmd_1位于前台。我是否可以在不停止cmd_1的情况下阻止cmd_2运行?直到cmd_1结束,此时cmd_2将启动,然后为时已晚。

我不认为这是可能的,但可能有工作控制?

-Z $ bg是否将两个命令都推入bg?更确切地说,cmd_1是否转到bg而cmd_2是(在哪里?“挂起的背景?”,如@ cmd?)仍在等待cmd_1退出?

没有条件地调用命令,ala“cmd_1&& cmd_2”,也没有调用后面的命令。 cmd_1在fg中运行,cmd_2尚未执行。

这里的facepalm是cmd_1需要很长时间才能完成,cmd_2是破坏性的,我真的不想打断并重新执行cmd_1。我只想cmd_1完成而cmd_2完全没有运行。

我可能会因cmd_2移动到cmd_2.sav而导致cmd_2失败,直到cmd_1完成并导致“-bash:cmd_2:command not found”,但我希望有一个更优雅的解决方案。在cmd_1完成之前,其他人可能会使用cmd_2。 (是的,我可以使用用户测试或某些东西在cmd_2包装器中包装cmd_2.real,但这种方式很疯狂)。

2 个答案:

答案 0 :(得分:1)

可能有更好的方法,但这可行:

  1. 按Control-Z暂停cmd_1。
  2. cmd_2将开始运行。你可以按Control-C来杀死它,或者你可以在第1步之前进行“重命名技巧”,这样它就没有机会启动。
  3. 一旦cmd_2被杀/阻止启动,请键入fg以恢复cmd_1操作。
  4. 如果您想提前尝试这一点以确保您获得的行为符合您的期望,请使用sleepecho命令的组合进行练习。即,从终端运行sleep 10; echo "hello"。按Control-Z暂停睡眠命令,输出“hello”。键入fg会恢复睡眠。

答案 1 :(得分:0)

在这种特殊情况下,只需添加...

echo "Press a key to begin... ${0}"
read

cmd_2的开头。这样你就不会严重妨碍想要使用cmd_2的人,你就有机会在它破坏你想要保存的东西之前杀掉它。