
たとえば、私が持っている
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 -x
。set -o xtrace
Bashでは、マニュアルページで以下を見ることができます。
-x
各単純命令、命令については、ケース命令、選択命令、または命令の算術が拡張された後、PS4の拡張値が表示され、その後に命令と拡張引数または関連する単語のリストが表示されます。
xtrace
と同じです
-x
。
zshにも同様のオプションがありますset
組み込み
XTRACE(
-x
, ksh-x
:)コマンドを実行すると、コマンドとその引数が印刷されます。
-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
また、各プロンプトの前後に実行されるコマンドを拡張するため、git
PS1で変数を使用する場合など、多くの場合には理想的ではない可能性があります。クリーンな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次のとおりですAlt。e
shell-expand-line
申し訳ありません。 Enterと実行で使用するソリューションがわかりません。