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)は次のようになります。拡大するは元のコマンドではなく、すべてが崩壊します。

答え2

エイリアスは単に代替です。コマンドを実行する前にメッセージを印刷するなど、より珍しい操作を実行するには、より強力な機能、つまり関数が必要です。定義がエイリアス定義のように見えるようにするには、関数を定義する関数を定義します。

function verbose_alias {
  local name=${1%%=*} expansion=${1#*=}
  eval "function $name {
    printf >&2 '%s is an alias for %s\\n' \"$name\" \"$expansion\";
    $expansion \"\$@\";
  }"
}
verbose_alias dbmigrate='rails db:migrate'

答え3

POSIXの要件set注文するこのオプションがあります

-x

   シェルは、コマンドを拡張した後にコマンドを実行する前に、各コマンドのトレースを標準エラーに書き込む必要があります。トレースを解除するコマンドをトレースするかどうかは指定されません。

https://pubs.opengroup.org/onlinepubs/009604499/utilities/set.html

したがって、互換性のあるシェルでまたはを使用できますset -xset -o xtraceBashでは、マニュアルページで以下を見ることができます。

-x

   各単純命令、命令については、ケース命令、選択命令、または命令の算術が拡張された後、PS4の拡張値が表示され、その後に命令と拡張引数または関連する単語のリストが表示されます。

xtrace

   と同じです-x

https://linux.die.net/man/1/bash

zshにも同様のオプションがありますset組み込み

XTRACE( -x, ksh -x:)

   コマンドを実行すると、コマンドとその引数が印刷されます。

https://linux.die.net/man/1/zshoptions

-xスクリプトまたはコマンドを実行するときにオプションを指定することもできます。

bash -x -c "echo This will be printed before running; ll"
bash -x script-to-be-debugged.sh
zsh -x -c "...; 3; md did-you-see-the-aliases"
zsh -x buggy-script.sh

また、各プロンプトの前後に実行されるコマンドを拡張するため、gitPS1で変数を使用する場合など、多くの場合には理想的ではない可能性があります。クリーンなUbuntu VMでは、実行中のコマンドのみが印刷されます。

また、見ることができますset -x効果は何ですか?

別のオプションは、印刷する前に変数を拡張または拡張しないことset -vです。set -o verbose

答え4

Bashはデフォルトではこのヘルプを提供しません。

デフォルトで使用できる2つの関連機能は次のとおりです。

  • shopt -s histverify

set と readline が使用されている場合、履歴置換の結果はシェルパーサーにすぐに渡されません。代わりに、結果行は読み取り行編集バッファーにロードされ、追加の変更が可能です。

押すときの動作部分を解決しますEnterが、コマンドラインでのみ履歴拡張が可能です。たとえば、

$ shopt -s histverify
$ echo "this is a test"
This is a test
$ echo !!
$ echo echo "this is a test"  <---- expanded by the simple use of enter!! 
  • 読書船shell-expand-line

シェル延長ケーブル(MCe)

シェルのように線を広げます。これは、エイリアスと履歴の拡張だけでなく、すべてのシェルワード拡張も実行します。履歴拡張の説明については、以下の履歴拡張を参照してください。

これがあなたが達成したい目標です。ただし、これを操作するための鍵はCtrl次のとおりですAlte

shell-expand-line申し訳ありません。 Enterと実行で使用するソリューションがわかりません。

関連情報