web-dev-qa-db-ja.com

エイリアスが定義された場所を確認することはできますか?

llなどのエイリアスは、aliasコマンドで定義されます。

type llのようなものでコマンドを確認できます

ll is aliased to `ls -l --color=auto'

またはcommand -v llと表示されます

alias ll='ls -l --color=auto'

またはalias llも出力します

alias ll='ls -l --color=auto'

whereエイリアスが定義されている、つまり.bashrcなどのファイルが見つからない、または実行中のシェルで手動で見つけることができないようです。現時点では、これが可能かどうかはわかりません。

bashによってロードされたすべてのファイルを調べ、それらのすべてをチェックする必要がありますか?

28
polemon

シェルに何をしているのかを表示するように依頼すると、手動での定義(おそらく履歴ログ)を見つけるのが難しくなります。その場合、grepはrcファイルで設定されたものを見つけるのに役立ちます。

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

シェルが上記の呼び出しの1つ(対話的にnullコマンドを実行する)で必要なオプションを正確にキャプチャしていない場合は、script

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

別のオプションは、straceまたはsysdigのようなものを使用して、シェルが接触するファイルを検索allし、手動でgrepに移動することです(シェルまたはプログラムの場合に便利です) -xフラグがありません);標準のRCファイルは、oh-my-zshまたはサイト固有の構成のようなものがどこにあるかを知っている人からコードを引き込んでいる場合(または、srontarが回答で指摘しているように、環境変数もある場合)の手動のファイル名チェックには十分ではありません。 。

26
thrig

ここで私はgrep -rlが非常に便利だと思います:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

word aliasがどのファイルで使用されているかがわかります。

おそらく~/.bashrcにあり、存在する場合は最も確実に~/.bash_aliasesにあります。


ただし、それがすべてのオプションをカバーしていることを完全に確認することは不可能です。これらのファイルは、他のファイルを呼び出したり、読み込んだりすることもあります。 ENVや$BASH_ENVなどの環境変数は、bashに他のいくつかのファイルをロードするように指示する場合があります。

環境内で変数BASH_ENVを探し、そこに表示されている場合はその値を展開し、展開された値を読み取りおよび実行するファイルの名前として使用します。

そして、変数を設定することでエイリアスを定義することもできます(私の強調):

BASH_ALIASES
メンバーがエイリアスのビルトインによって維持されるエイリアスの内部リストに対応する連想配列変数。 この配列に追加された要素はエイリアスリストに表示されます

7
Isaac

エイリアスのソースを実際に一覧表示する方法はわかりませんが、bashを使用しているように見えるため、これらは可能なソースファイルだと思います。

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

それらを介してgrepを実行してエイリアスを見つけることができるはずです。 grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc

2
edaemon

thrig's answer@ MarkPlotnickの提案 を組み合わせて、BASH_ALIASES[ll]で絞り込むように設定されています。 BASH_SOURCE配列とLINENO変数は、ここでは特に便利です。残念ながら、BASH_ALIASES[ll]が設定されると、エイリアスが設定された後にのみ成功するため、そのような最初の行が完全に別のファイルにある可能性があります。

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

次のような出力を与える:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

このチェックを使用してシェルを終了することもできます。

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
1
muru

whichを使用するだけで成功しました。

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
0
Charles Clayton