エイリアスされたコマンドに関連するbashrcの更新によって引き起こされるシステム上のすべてのコマンドの競合をリストする簡単な方法はありますか?
たとえば、誰かがalias ls=/path/to/user-generated/executable
bashrcに書き込みます。これを見つける方法は、実際のコマンド(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
各項目を実行し、grep
1つも合っていることを確認しますfile
。
答え3
最初の質問として、bashは内部的にハッシュテーブルを使用し、最後のオーバーライドのみを記録するため、競合を一覧表示する方法はありません。
コマンドがエイリアスであることを確認するには、alias ls
「見つかりません」などのメッセージが表示された場合はエイリアスではなく、それ以外の場合はエイリアスです。
エイリアスに関係なく元の機能を開始するには、スラッシュを前に置きます。たとえば、\ls
lsはエイリアスを無視し、実際のハッシュを開始します。
編集する
コマンドがエイリアスかどうかをすばやく知りたい場合は、次のコマンドをset -x
実行してデバッグモードを有効にしますls
。
実行中の実際のコマンドのデバッグ出力を表示できます。
デバッグモードをオフにするには、次を使用します。set -
答え4
bash組み込みコマンドを使用して、すべてのcompgen
コマンドとすべてのエイリアスのリストを取得できますcompgen -ac
。エイリアスでもあるすべてのコマンドはこのリストに重複するので、簡単な回避策はの出力で重複する項目を見つけることですcompgen -ac
。
ただし、コマンドがパスに 2 回表示されると、重複が発生する可能性があります。たとえば、エイリアスではなくても2回リストします/bin/which
。/usr/bin/which
compgen -ac
which
したがって、必要なのは、それからすべての重複エントリを取得し、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
両方に共通のラインのみを出力します。