tmux スクリプトで開始したコマンドを終了した後、シェルに戻るにはどうすればよいですか?

tmux スクリプトで開始したコマンドを終了した後、シェルに戻るにはどうすればよいですか?

フォローしていますこのチュートリアルtmux ウィンドウの作成をスクリプト化します。

tmux new-window t $SESSION:0 -k -n MAIN 'cd ~/main/ && perl -Ilib myapp'

時々、tmux を起動した後に myapp を強制終了することがあります。そのディレクトリのシェルに戻りたいのですが、代わりにウィンドウが完全に強制終了されます。これを修正する最善の方法は何ですか? 少なくとも 1 つの解決策は、シェルを実行してそのシェルにコマンドを実行させることだと思いますが、それを実現する最善の方法はわかりません。

答え1

tmux new-window -t $SESSION:0 -k -n MAIN 'cd ~/main/ && perl -Ilib myapp; $SHELL'

以前のコマンドが終了したときにデフォルトのシェルを起動します (戻り値に関係なく、つまり、それらを強制終了しなかった場合でも)。

プロセスが強制終了または失敗した場合にのみシェルに戻りたい場合perl(成功した場合はtmuxウィンドウを閉じたい場合)は、

tmux new-window -t $SESSION:0 -k -n MAIN 'cd ~/main/ && perl -Ilib myapp || $SHELL'

答え2

tmuxすでにシェルが開かれており、コマンドcdperlコマンドが実行されます。別のシェルをその下に置き、対話型セッションを継続する(または を使用せずにウィンドウが閉じないようにするset-remain-on-exit)には、次のようにします。

tmux new-window -t $SESSION:0 -k -n MAIN
tmux send-keys 'cd ~/main/ && perl -Ilib myapp' C-m

作成されたシェルの下に別のシェルを作成しtmux、そのシェルでコマンドを実行して対話型にしたい場合 (後でシェルを実行する @n.st の回答とは異なります)、次のようにします。

tmux new-window -t $SESSION:0 -k -n MAIN 'bash --init-file <(echo "cd ~/main/ && perl -Ilib myapp")'

bash環境が不完全であることが問題である場合は、次のようにします。

tmux new-window -t $SESSION:0 -k -n MAIN 'bash --init-file <(echo "source ~/.bashrc; cd ~/main/ && perl -Ilib myapp")'

関連情報