現在の端末を終了してコマンドを実行したいです。できますか?
PS::ループを作成したとします。while true; do bash;done
ベストアンサー1
適切なトラップを使用してサブシェルで実行できます。たとえば、echo -e '\nCommand done
最後に実行するにはwhile true; do true; done
、次のコマンドを使用できます。
mario@mario-K53SV:~$ (trap 'echo -e "\nCommand done"' EXIT; while true; do true; done)
トラップは、サブシェルの EXIT イベントで定義したコマンドを登録します。サブシェルを作成するには括弧が必要です。これを一般化してコマンドを変数(たとえば)に入れるには、そのコマンドを正しく実行するMY_COMMAND='while true; do true; done'
必要があります。eval
この出力例は、使用される用途を正確に示しています(evalがなければ機能しません)。
mario@mario-K53SV:~$ YOUR_COMMAND="while true; do true; done"
mario@mario-K53SV:~$ EXECUTE_ON_EXIT="echo -e '\nCommand done'"
mario@mario-K53SV:~$ (trap 'eval ${EXECUTE_ON_EXIT}' EXIT; eval ${YOUR_COMMAND})
^C
Command done
mario@mario-K53SV:~$
自動的に電源を切るためにも使用できます。端末同様に、EXITハンドラコマンドの末尾にはkill -s SIGHUP $$
ハンドラの末尾にのみ含めることができます(例EXECUTE_ON_EXIT="echo -e '\nCommand done'; kill -s SIGHUP $$"
:)。