題 第二次退出時立即終止第一個命令


我一直在尋找這種情況的最佳實踐。

如果我有process2依賴於事先運行的process1。我設置了一個別名:

alias both='process1 & process2'

然後,當process2退出時,我也想讓process1退出(我目前的解決方案是返回終端並且 kill %%)。

例如(通過usb從mac連接到iOS設備):

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

我該如何保留 iproxy 跑步,並儘快殺死它 ssh 退出?


4
2018-06-21 07:11


起源


單獨一下,你有更多的信息,重新:通過SSH通過USB連接到iOS? - tjt263
@ tjt263 - 顯然只適用於越獄設備...... - Elist
@ tjt263,我真的不明白你在問我什麼。你能明確說出你追求的是什麼信息嗎? - Elist
不要以為我能比這更簡單......我從來沒有聽說過 iproxy 要么 ssh 通過USB,我只是好奇。我甚至不太了解它更具體。 - tjt263
好。 iproxy 是一個實用程序,用於將本地端口轉發到通過usb連接的Apple移動設備上的端口。它是開源的一部分 libimobiledevice 項目。在上面的例子中, localhost:2222 被轉發到連接的iphone上的端口22。 iPhone有一個 ssh 守護進程偵聽端口22.你還想要我擴展的其他東西嗎? - Elist


答案:


只需追加 kill $! 到最後: process1 & process2; kill $!

$! 是一個變量(在Bash中容易混淆地稱為“參數”),並且會 擴大 到任何地方的最後一個背景PID:

擴展到最近放入後台的作業的進程ID,無論是作為異步命令執行還是使用bg內置(請參閱下面的JOB CONTROL)。

%% 是特殊的,並且只會在shell內置命令的上下文中擴展到最後一個後台PID fg 和 kill。不幸的是,這一點並不清楚 man 頁:

符號%%和%+指的是當前作業的shell概念,它是在前台或在後台啟動時停止的最後一個作業。


PS:如果你需要將它作為命令字符串,請確保 kill $! 是單引號,所以它在運行時擴展。更好的是,寫一個函數而不是別名來避免它們 限制


4
2018-06-21 07:18



大!實際上,我想的更容易......順便說一句,你能解釋一下嗎? $! VS %%? - Elist
優秀;我同意,re:function>別名。 - tjt263