Enterを押したときに拡張エイリアスを反映するモードはBashとZshにありますか?

Enterを押したときに拡張エイリアスを反映するモードはBashとZshにありますか?

たとえば、私が持っている

alias dbmigrate='rails db:migrate'

シェルに入力するときにBashとZshでこれを構成するパターンや簡単な方法はありますか?

$ dbmigrate  # press Enter

実行する前にエイリアス拡張をエコーするのはなぜですか?

ベストアンサー1

存在する強く打つalias-expand-line、readline関数がありますが、history-and-alias-expand-lineデフォルトではどのキーにもバインドされていません。直接バインドできますControl-T。たとえば、次のようになります。

bind '"\C-T": history-and-alias-expand-line'

Enter押すたびにコマンドが常に実行されるわけではないので、独自のバインドを試みることは混乱する可能性がありますEnter(たとえば、不完全なパイプの場合など)。

もう1つ問題がありますが、DEBUGコマンドが実際にユーザーによって入力された(たとえば、コマンドの置き換えPROMPT_COMMANDではPS1難しいかもしれません)。どの実行前のコマンド:

trap 'echo "> $BASH_COMMAND"' DEBUG

bash$ pwd
> pwd

存在する扱いにくいpreexec、ユーザーが入力したコマンドと異なる場合は、拡張コマンドを印刷する関数を簡単に定義できます。

preexec(){ [ $1 != $2 ] && print -r "> $2" }

zsh$ j
> jobs

ただし、エイリアスを強制的に拡張すると、一部のエイリアス+履歴トリックは正しく機能しません。たとえば、Escapeなどを行わずにcこのような計算を実行するためにbashにエイリアスがあります。c 3.17 * 4.2*(

alias c='_c=$(fc -nl -0); bc -l <<<${_c#*c} #'

readlineが展開されると、履歴の現在の行(から返された行fc -nl -0)は次のようになります。拡大するは元のコマンドではなく、すべてが崩壊します。

おすすめ記事