コマンドラインに入力したコマンドにすでにエイリアスがあることを認識できるシェル/シェルスクリプトはありますか?
例えば
シェルに私が入力
git checkout master
シェルプリント"You can use alias you have for that : gcm"
その後、シェルは通常どおりマスターチェックを進めます。
このコマンドは、利用可能なすべてのエイリアスを一覧表示することを知っていますalias
。エイリアスを使用しない場合は、エイリアスを使用し、コマンド全体を入力するようにシェルから思い出させたいと思います。
答え1
これは概念的なアプローチです。可能働く
このalias
コマンドはすべてのエイリアスのリストを生成し、各エイリアスの後にエイリアス=
とその定義が続きます。この出力は、最初のスペースから最初のエイリアス名を抽出することで解析できます=
。最初の後のすべては=
一致する定義です。これは、awkで連想配列を使用すると簡単に処理できるように聞こえます。
(私の考えでは)これには2つの合併症があります。
1)定義は複数の単語で構成できるため、定義の長さから囲む引用符を引いた長さを測定し、入力されたコマンドの比較をその長さに制限する必要があります。
2) エイリアスには奇妙な内容を含めることができます。私にとって最も奇妙なことは次のとおりです(もっと奇妙になると確信しています)。
alias pqp='cd ~/pq;[ -n "$(ls)" ] && mprb * || echo "Print Queue Empty"'
ここでの要点は、エイリアスがシェルが解釈して拡張したいすべての特殊文字を(ほぼ?)含めることができるため、比較する必要がある2つの文字列を単純なものとして扱うawkやPythonなどの他の言語でエンコードする方が良いことです。ひも。
次の問題は、一致が完了してメッセージが発行された後に実際にコマンドを実行したいことです。
ここで懸念されるのは、プログラム内で実行するすべてが他のスクリプトであっても(通常)サブプロセスで実行されることです。これは、コマンドが終了し、サブシェルが閉じられると、コマンドのすべての(シェルレベル)副作用が失われることを意味します。最も明白なのは、$?
ユーティリティの戻りコードでキャプチャして再エクスポートする必要がある戻りコードです。
エイリアスにsource
、.
コマンドを使用する呼び出しが含まれていれば幸運ではありません。サブシェルでコマンドを実行すると、予想される副作用が完全に無効になるためです。
Shellには多くの組み込みコマンドが含まれています。たとえば、cd
一部は[
同じプログラムを持っていますが、/usr/bin/test
一部はcd
そうではなく、同じ操作を実行するプログラムの場合でも、組み込みバージョンが常に同じ動作とオプションを持つわけではありません。外部バージョンとして。
上記の問題は、最後のコマンドが現在のシェルレベルの標準入力以外の場所から出てくるので、別の方法で処理されるために発生します。ここが似ています。自動キーたぶん役に立つかもしれません。
AutoKeyは、X(gui)環境でさまざまなタスクを自動化するために使用できるマクロプロセッサです。この場合、カスタムショートカットを押したときにマクロを呼び出すために使用できます。このマクロは、ユーザーが入力したコマンドラインを読み取り、解析し、メッセージ(別名などに関する情報)をエクスポートし、キーボードで入力したかのようにコマンドを再入力できます。
ここでの利点は、Linux(実際にデスクトップ環境/ターミナルエミュレータ)がコマンドを入力した人であるかどうかはわかりません。
このアプローチの2番目の利点は、最初にショートカットキーを押さずにコマンドだけを入力すると、オーバーヘッドなしですべてが通常どおりに機能することです。
これは、StackExchangeと他の場所のさまざまな場所で長く議論された最後のポイントに移動します。
システムの一般的な部分を取得し、ユーザー(この場合はあなた)に完全に表示されたときに背後の基本的な作業方法を変更することは、ほとんど常に悪い考えです。
つまり、非標準的な方法で動作するようにシステムをカスタマイズすると、2 つの主要な結果が発生します。
1)他の人がシステムを使用している場合(問題のデバッグを助けるためなど)、予期しない結果が発生し、不快な結果が発生する可能性があります。
2)変更された動作に慣れている場合は、同じ方法でカスタマイズされていない他のシステムを使用すると(無意識のうちに)、その動作が機能することを期待します。
一般的な例は、次のエイリアスを定義することです。
alias rm='rm -i'
別のシステムに入力し、rm
最初のメッセージが表示されたときにファイルがすぐに削除されると予想されるまで、これは良い考えのように聞こえます。
この問題の解決策は次のとおりです。
alias rmi='rm -i'
入力すると動作しますが、他のシステムに入力するとコマンドが見つかりません。
これは、重要なことが中断され、必要なだけ注意を払わずに問題を解決しなければならないという圧力を受ける夜中に特に重要です。今。予期しない行動や仕事が本当に望まない場合は、人々に説明するのに時間を無駄にする必要があります。
ホットキーを有効にするAutoKeyマクロを使用して、エイリアスチェックと同じように機能します。ショートカットを押してマクロをアクティブにしようとしない場合は、すべてが期待どおりに機能します。適切に選択されたショートカットは誤って押すことがなく、他のシステムで習慣的に押しても有害な影響を与えない可能性があります。
答え2
私は解決策を持っていますbash
。各コマンドの前に実行される関数が必要です。これはデフォルトではサポートされていないため、問題を解決するにはトラップをbash
使用する必要があります。DEBUG
Bashのマニュアルページのトラップセクションを参照してくださいDEBUG
。
sigspecがDEBUGの場合、argコマンドは、すべての単純コマンド(コマンド、caseコマンド、selectコマンド、コマンドのすべての算術)の前、およびシェル関数で最初のコマンドが実行される前に実行されます。
したがって、関数は次のようになります(最初の部分は関数からコピーされました)。スーパーユーザーの回答):
preexec () {
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")
# check if the command occures as an alias
a=$(alias | grep -F "='""$this_command""'" | grep -oP '(?<=alias\ )[^=]+')
# if yes, print a notice
[ -n "$a" ] && echo -e "You can use an alias you have for that: \033[01;32m$a\033[00m"
}
trap 'preexec' DEBUG
入力するとき:
$ git checkout master
次のように印刷されます。
You can use an alias you have for that: gcm
その後、コマンドを実行し続けます。
答え3
私が欲しいものをさらに詳しく調べている間にこれを見つけました。
zsh用のプラグインがありますエイリアスプロンプトこれをやった。