ターミナル-不注意で終了した後にセッションを再起動する方法は?


22

時々、ターミナルセッションを誤って終了します(通常、リモートシステムに接続しているのに、接続していないと思うため)。

ここに画像の説明を入力してください

この時点でセッションを再開するにはどうすればよいですか?私は通常のワークフロー用にすべてのタブが設定されているため、ウィンドウまたはタブを閉じたくないので、現在のタブのセッションを再度取得するだけです(つまり、bashプロンプトに戻ります)。

これまでに見つけた唯一の解決策は、ターミナルを完全に終了して再度開くことですが、それは明らかに、他のターミナルウィンドウ/タブで行っている他の操作を中断するため、理想とはほど遠いです。


1
Linux(KDE / Gnome)ターミナルエミュレータを使用すると、タブの順序を変更できます。したがって、新しいタブを開始する場合、閉じたタブを置き換えるためにそのタブを移動できます。OS Xの端末にはそれがありませんか?(私はMacの人ではありません。「ホットネットワークの質問」でこれを見ました。)また、ターミナルウィンドウのタブではなく、GNU画面を使用して多くのシェルセッションを多重化します。別のコンピューターでスクリーンセッションのある別のタブがあります。私は時々私のシェルは番号を付けたように私を、私は一度に二つのことを確認したい場合は、別の端末を開くが、通常、道画面がない、というだけでそこより
ピーター・コルド

1
とにかく、1つのGUIタブで同じホスト上の複数のシェルを保持するための画面(または、まだ画面を知らない場合はtmux)をお勧めします。このタブ/スクリーンウィンドウの2レベルの階層により、何がどこにあるかを追跡することなく、たくさんのものを開くことができます。また、私が言ったように、さまざまなシェルの番号を持っていると、^t 8クリックするタブやヒットするctrl-pgupの数を視覚的にカウントするのではなく、特定のコンテキストでスワップする番号を簡単に覚えることができます。
ピーターコーデス

1
screenとtmuxの両方には、各画面ウィンドウ内に構成可能なスクロールバックがあります。しかし、再起動後も持続するためにディスク上にスクロールバックを保持することについて何も見たことはありません。それはきちんとしている。3つのタブは、精神的に追跡するのに十分簡単です。GUIファイルブラウザーではなく、コマンドラインからほとんどすべてを実行するため、ホームデスクトップには通常10のようなものがあります。(ビデオ/オーディオブックなどの再生)cdコードの作業中は、通常、ソースコードへのシェルが3つほどあります。
ピーターコーデス

1
とにかく、タブをドラッグすると、誤ってタブを閉じた状態から簡単に元に戻すことができるはずです。
ピーター

1
単一のターミナルエミュレータタブ内のローカルシェルセッションで、多くの人がそれらをローカルで使用するとは思わない。IDK、おそらく他の古いコマンドライン中毒者もそれを行います。主な使用例は、sshどこかに行った後です。私はスクリーンを使用することに慣れて、それをローカルおよびリモートセッションで使用しています。私が理解しているようscreenに、筋肉の記憶がまだない場合は、画面が古くて気難しいのでtmuxを学んでください。おそらくに切り替えてtmux、に使用しているのと同じキーバインドをすべて使用するように構成できますがscreen、画面は引き続き正常に機能します。
ピーターコーデス

回答:


26

この時点では、タブを元に戻す方法はありません。端末セッションが閉じられ、TTYがなくなりました。賢いことをするためにタブを参照する方法はありません。今後この問題が発生しないように、この関数を.bashrcまたは.profileに追加することをお勧めします。

exit() {
    read -t5 -n1 -p "Do you really wish to exit? [yN] " should_exit || should_exit=y
    case $should_exit in
        [Yy] ) builtin exit $1 ;;
        * ) printf "\n" ;;
    esac
}

または、Zシェルを使用する(zshrcに追加する)場合:

exit() {
    if read -t5 -q should_exit\?"Do you really wish to exit? [yN] "; then
        builtin exit $1
    fi
}

それは、あなたとその迷惑な終了コマンドの間のすてきな小さな障壁です!主は、私が過去に何度も同じことをしたことを知っています。


1
わかった!現在、5秒(-t 5オプション)後、読み取りコマンドは失敗し、それに続く終了コマンドがトリガーされます。
ウィリアムTフログガード

1
すばらしい-ありがとう-2回のアップ投票をお願いできます!;-)
ポールR

1
@PaulR:exitBashを使用している場合、エイリアスを作成する必要はありません。スクリプトはに入れることができます~/.bash_logout
追って通知があるまで一時停止します。

2
@DennisWilliamson:おもしろいアイデアですが、どのように内部からログアウトをキャンセルするかわかりません.bash_logoutか?
ポールR

3
@PaulR:おっと。私はそれを考慮しなかった!完全を期すために、エイリアスlogoutを作成しIGNOREEOF、1より大きい値を設定する(または^ Dを再バインドする)必要もあります。
追って通知があるまで一時停止します。

5

William T Froggardのスクリプトは、私が必要なことをしませんでした。一般に、この状況に陥る唯一の方法は^ D(ctrl+ D)であり、再定義exitはその状況に対して何もしなかったからです。私にとっては、デニス・ウィリアムソンの設定の提案でIGNOREEOF十分でした。私はちょうど追加しました:

# Do not exit on a single ^D, require 2 in a row
IGNOREEOF=1

私の~/.bashrcファイルに、そして今(私がトップレベルのシェルにいてターミナルを終了する場合)最初の^ Dは応答を生成します:

Use "logout" to leave the shell.

すぐに^ Dを再度入力すると、シェルが終了するので、必要なときに終了するのは簡単ですが、単一の^ Dで警告が表示されます。(必要に応じて、IGNOREEOF追加の連続した^ Dを必要とするより高い数値に設定できます。)

また、サブシェルを使用している場合、最初の^ Dが応答を生成します。

Use "exit" to leave the shell.

繰り返しになりますが、^ Dを追加すると、サブシェルを終了することとトップレベルシェルを終了することの違いがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.