Gnu-Screen

如何在退出螢幕之前獲得確認?

  • April 14, 2020

如何在退出螢幕之前獲得確認(在命令行上鍵入 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是不可靠的;您可以打開兩個視窗,然後關閉 window 0,將 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
}

引用自:https://unix.stackexchange.com/questions/436959