bashrcでエイリアスを使用するときの衝突の可能性をテストする方法は?

bashrcでエイリアスを使用するときの衝突の可能性をテストする方法は?

エイリアスされたコマンドに関連するbashrcの更新によって引き起こされるシステム上のすべてのコマンドの競合をリストする簡単な方法はありますか?

たとえば、誰かがalias ls=/path/to/user-generated/executablebashrcに書き込みます。これを見つける方法は、実際のコマンド(ls)をマスクすることです。 1つのアプローチは、bashrcをインポートする前後にすべてのエイリアスを実行して出力を比較するようです。もっと良い方法がありますか?

私はUbuntu 12.04を実行しています。

バッシュ - バージョン

GNU bash、バージョン 4.2.24(1)-リリース(i686-pc-linux-gnu)

答え1

bashがコマンドを解釈する方法を理解するために使用できますtype

答え2

エイリアスによってブロックされたコマンドを確認するには、次の手順を実行します。

alias                            |
awk -F '[ =]+' '{print $2}'      |
while read cmd; do
  type -ta "$cmd" | grep -q file \
    && printf "%s is overloaded: \"%s\"\n" "$cmd" "$(alias $cmd)"
done

説明する

alias定義された別名を個別にリストし、awkその名前を抽出します。 whileループはtype -ta各項目を実行し、grep1つも合っていることを確認しますfile

答え3

最初の質問として、bashは内部的にハッシュテーブルを使用し、最後のオーバーライドのみを記録するため、競合を一覧表示する方法はありません。

コマンドがエイリアスであることを確認するには、alias ls「見つかりません」などのメッセージが表示された場合はエイリアスではなく、それ以外の場合はエイリアスです。

エイリアスに関係なく元の機能を開始するには、スラッシュを前に置きます。たとえば、\lslsはエイリアスを無視し、実際のハッシュを開始します。

編集する

コマンドがエイリアスかどうかをすばやく知りたい場合は、次のコマンドをset -x実行してデバッグモードを有効にしますls

ここに画像の説明を入力してください。

実行中の実際のコマンドのデバッグ出力を表示できます。

デバッグモードをオフにするには、次を使用します。set -

答え4

bash組み込みコマンドを使用して、すべてのcompgenコマンドとすべてのエイリアスのリストを取得できますcompgen -ac。エイリアスでもあるすべてのコマンドはこのリストに重複するので、簡単な回避策はの出力で重複する項目を見つけることですcompgen -ac

ただし、コマンドがパスに 2 回表示されると、重複が発生する可能性があります。たとえば、エイリアスではなくても2回リストします/bin/which/usr/bin/whichcompgen -acwhich

したがって、必要なのは、それからすべての重複エントリを取得し、compgen -acエイリアスリストと比較することです。エイリアスでもある重複項目だけが隠されたコマンドのエイリアスです。comm(1)コマンドとbashプロセス置換を使用してこれを行うことができます。

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sortすべてのエイリアスのリストです(ソート済みcomm)。compgen -ac | sort | uniq -dコマンドとエイリアスリストのすべての重複リスト。comm -12両方に共通のラインのみを出力します。

関連情報