ユーザーがCtrl-Cを使用してコマンドを終了した後にコマンドを実行できますか?

ユーザーがCtrl-Cを使用してコマンドを終了した後にコマンドを実行できますか?

だから私の場所では、ビルドの共有エイリアスセットを使用します。まるで…

alias 'build'='cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; cd -'

makeコマンドを実行するのに約3分かかり、通常は何かを逃したことに気づき、Ctrl-Cを押してすぐにビルドを再実行するので、これは非常に迷惑です。これは私が好きではないディレクトリに入り、再び入らなければならない痛みを伴うパスをもたらしました。

私が本当に欲しいのは…

alias 'betterbuild'='pushd .; build; even-if-the-user-cancelled popd'

これを行う方法はありますか?

答え1

さて、エイリアスは実際にこのような複雑な作業を行うことを意図したものではないので、スクリプトで作成するように言いたいと思います。はいより複雑な作業や長時間の作業に最適です。エイリアスとは、デフォルトでは、デフォルトの引数をデフォルトでサポートしていないコマンドにデフォルトの引数を提供するなど、あるコマンドを別のコマンドにマップすることを意味します。

しかし、あなたがこのエイリアスを維持したいと考えたので、エイリアスの範囲内で目的のアクションを実行する方法を理解する必要があります。

次に、自然な選択は、エイリアス内でサブシェルを起動することです。たとえば、

~$ alias xyz1='( cd ~/tmp; sleep 10; cd ~ )'
~$ alias xyz2='cd ~/tmp; sleep 10; cd ~'
~$ xyz2
^C
~/tmp$ cd
~$ xyz1
^C
~$

CtrlCこれは、エイリアスが正常に実行を完了した場合、または+で中断されたときに終了するサブシェル内の作業ディレクトリのみを変更します。

答え2

サブシェルを使用することもできます。

alias build='( cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

上記の例では、サブシェルcd $BUILD_ROOTの現在の作業ディレクトリは変更されていますが、エイリアスを呼び出す対話型シェルは変更されません。一般的なケースでは、サブシェルとシャットダウントラップを使用できます。

alias build='( cleanup() { do; cleanup; }; trap cleanup EXIT; cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

ただし、スクリプトの使用を再検討してください。上記の例は、スクリプトではるかにきれいに見えます。スクリプトは独自のシェルインスタンス内で解釈されます。スクリプトにサブシェル構文は必要ありません。

お客様は、ご意見の中で、スクリプトがお客様のエイリアスによって異なると述べました。これは、スクリプトを実行する代わりにスクリプトを受け取っていることを意味し、これは通常悪い習慣です。また、一部のエイリアスはエイリアスによって異なると言われています。エイリアスにスクリプトを使用できます。

関連情報