画面を終了する前に確認する方法(コマンドラインに終了を入力した場合)は可能ですか?
ベストアンサー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
されたか、SHLVL
1より大きいことを確認するなど、より多くのテストを実行しました。画面はSTYを設定し、bashはSLVLを増やしますが、これらの変数のどれも読み取り専用ではないため、このテストはあまり使用するほど強力ではありません。screenも
WINDOW
変数を設定しますが、これを確認する0
ことは信頼できません。 2つのウィンドウを開き、windowを閉じて0
windowを1
最後のウィンドウとして残すことができます。デフォルトでは、EOF(通常Control+ D)を入力すると、このラッパー機能をバイパスしてシェルがすぐに終了します。私が知っている最善の解決策は、変数を
IGNOREEOF
ゼロ以外の値に設定することです。しかし、これは避けられないシェルのシャットダウンを遅らせるだけです。
上記ではbash(およびGNU procutils)関連の機能を多く使用しているので、POSIX互換のソリューションも提供したかったです。この行を、特定の親PIDを持つプロセス数をキャプチャするシナリオps
に変更します。もう1つの変更は、プロンプトとをps ... | grep -c
再作業することです。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
}