一旦第二个命令退出,立即终止第一个命令

一旦第二个命令退出,立即终止第一个命令

我一直在寻找针对这种情况的最佳实践。

假设我有进程 2,它依赖于进程 1 的预先运行。我设置了一个别名,如下所示:

alias both='process1 & process2'

然后,当进程 2 退出时,我希望进程 1 也退出(我当前的解决方案是返回到终端并kill %%)。

例如(通过 USB 从 Mac 连接到 iOS 设备):

alias usbssh='/usr/local/bin/iproxy 2222 22 & ssh -p 2222 root@localhost'

我该如何继续iproxy运行并在退出时立即将其杀死ssh

答案1

只需附加kill $!到末尾:process1 & process2; kill $!

$!是一个变量(在 Bash 中容易混淆地称为“参数”),并且将扩张到任意位置的最后一个背景 PID:

扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用内置命令 bg 执行(请参阅下面的 JOB CONTROL)。

%%是特殊的,并且只会在 shell 内置命令(如fg和 )的上下文中扩展到最后一个后台 PID kill。不幸的是,从页面上看不清楚man

符号 %% 和 %+ 指的是 shell 的当前作业概念,它是最后一个在前台停止或在后台启动的作业。


PS:如果您需要将其设为命令字符串,请确保kill $!将其用单引号括起来,以便在运行时将其展开。更好的方法是编写一个函数而不是别名,以避免它们的局限性

相关内容