Gnu-Screen
如何在退出螢幕之前獲得確認?
如何在退出螢幕之前獲得確認(在命令行上鍵入 exit 時)。這可能嗎?
我通過
exit
用函式屏蔽命令來解決這個問題;該函式檢查您是否在螢幕內,以及您是否是該螢幕程序剩下的唯一子程序。exit() { if [[ "$(ps -o pid= --ppid "$(ps -o ppid= -p "$$")" | wc -l)" -eq 1 ]] then read -p "Warning: you are in the last screen window; do you really want to exit? (y/n) " case $REPLY in (y*) command exit "$@" ;; esac else # not within screen at all, or not within the last screen window command exit "$@" fi }
您必須將該功能包含在您的(bash)配置文件中,例如
~/.bash_profile
. 啟動螢幕時,它將(除非另有說明)啟動您的 $SHELL 實例。該外殼將是螢幕程序的子程序。當從子 shell 退出時,上面的程式碼檢查有多少程序是目前 shell 的父程序的子程序。從裡到外:
$(ps -o ppid= -p "$$")
– 詢問=
目前程序的父 PID(添加抑制標題行)($$
)$(ps -o pid= --ppid ... | wc -l)
– 詢問父 PID 是我們父的 PID 列表(同樣沒有標題),然後計算輸出的行數如果看起來我們是螢幕會話的最後一個子程序,它會提示確認;如果響應以字母開頭
y
,函式呼叫“real”exit
命令退出shell;否則,函式在不退出 shell 的情況下結束。如果我們不是最後一個子程序,則函式繼續執行並正常退出。
我開發這個時有幾點注意事項:
- 我最初在該
if
行中進行了更多測試,以查看我們是否在螢幕會話中,包括查看是否STY
已填充以及SHLVL
是否大於 1。螢幕設置 STY,而 bash 將增加 SHLVL,但這些變數都不是只讀的,所以測試不夠強大,沒有用。- screen 也設置了一個
WINDOW
變數,但檢查它0
是不可靠的;您可以打開兩個視窗,然後關閉 window0
,將 window1
作為最後一個視窗。- 預設情況下,輸入 EOF(通常是
Control
+D
)會導致 shell 立即退出,繞過這個包裝函式。我知道的最好的解決方法是將變數設置IGNOREEOF
為某個非零值;不過,這只會延遲 shell 不可避免的退出。因為我在上面使用了很多 bash-(和 GNU procutils-)特定功能,所以我還想提供一個符合 POSIX 的解決方案。該
ps
行更改為一個ps ... | grep -c
方案,以擷取具有特定父 PID 的程序數。另一個更改是將 重新工作read -p
為單獨的提示和read
.exit() { parent="$(ps -o ppid= -p $$)" if [ "$( ps -eo ppid= | grep -c "^ *${parent}\$" )" -eq 1 ] then printf "Warning: you are in the last screen window; do you really want to exit? (y/n) " read REPLY case $REPLY in (y*) command exit "$@" ;; esac else # not within screen at all, or not within the last screen window command exit "$@" fi }