画面を終了する前にどのように確認できますか?

画面を終了する前にどのように確認できますか?

画面を終了する前に確認する方法(コマンドラインに終了を入力した場合)は可能ですか?

ベストアンサー1

私は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 インスタンスを起動します。シェルはスクリーンプロセスの子プロセスになります。サブシェルで終了すると、上記のコードは現在のシェルの親プロセスの子プロセス数を確認します。内部から外へ:

  • $(ps -o ppid= -p "$$")-=現在のプロセスの親PIDを要求します(抑制ヘッダー行を追加)($$
  • $(ps -o pid= --ppid ... | wc -l)- 親PIDが私たちの親であるPIDリスト(ヘッダなし)を要求してから、出力された行数を計算します。

スクリーンセッションの最後の子のように見える場合は、確認メッセージが表示されます。応答が文字で始まると、関数yは「実際の」exitコマンドを呼び出してシェルを終了します。

最後の子プロセスではない場合、関数は実行され続け、正常に終了します。

これを開発するときに注意すべきいくつかの点があります。

  • if最初は、スクリーンセッションにいるかどうかを確認するために入力STYされたか、SHLVL1より大きいことを確認するなど、より多くのテストを実行しました。画面はSTYを設定し、bashはSLVLを増やしますが、これらの変数のどれも読み取り専用ではないため、このテストはあまり使用するほど強力ではありません。

  • screenもWINDOW変数を設定しますが、これを確認する0ことは信頼できません。 2つのウィンドウを開き、windowを閉じて0windowを1最後のウィンドウとして残すことができます。

  • デフォルトでは、EOF(通常Control+ D)を入力すると、このラッパー機能をバイパスしてシェルがすぐに終了します。私が知っている最善の解決策は、変数をIGNOREEOFゼロ以外の値に設定することです。しかし、これは避けられないシェルのシャットダウンを遅らせるだけです。

上記ではbash(およびGNU procutils)関連の機能を多く使用しているので、POSIX互換のソリューションも提供したかったです。この行を、特定の親PIDを持つプロセス数をキャプチャするシナリオpsに変更します。もう1つの変更は、プロンプトとをps ... | grep -c再作業することです。read -pread

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
}

おすすめ記事