(__git_ps1私の場合)bash関数が定義されているファイルを見つける方法がわかりません。
私は実験しdeclare、type、which、何も私のソースファイルを伝えていません。declareファイル名と行番号を印刷できる場所を読みましたが、どのように説明されていませんでした。のhelpページdeclareもそれを言っていません。
この情報を取得するにはどうすればよいですか?
(__git_ps1私の場合)bash関数が定義されているファイルを見つける方法がわかりません。
私は実験しdeclare、type、which、何も私のソースファイルを伝えていません。declareファイル名と行番号を印刷できる場所を読みましたが、どのように説明されていませんでした。のhelpページdeclareもそれを言っていません。
この情報を取得するにはどうすればよいですか?
回答:
関数を実行する準備ができている場合はset -x、実行のトレースに使用してPS4変数を設定することにより、情報を取得できます。
追加のデバッグ情報を記録--debuggerするshopt -s extdebugためにbashを使用するか、使用します。
Set PS4、ソース行を表示するためにトレースするときに出力される「プロンプト」。
トレースをオンにします。
その後、関数を実行し、各行に対して関数のファイル名を取得できます。
set +xトレースをオフにするために使用します。
この場合、次のコマンドを実行します
bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x
関数を実行する意思がない場合でも、デバッグを設定して情報を取得できます。手順は
bash --debuggerまたはshopt -s extdebug関数が定義される前。declare -F __git_ps1関数が定義されている場所を報告します。
PS4で注釈付きの実行トレースを表示するのに比べて、この方法の利点は次のとおりです。
実行トレースの利点は次のとおりです。
私は強く持つお勧めshopt -s extdebugの両方の開始時~/.bashrcと~/.bash_profile異なるカバーするためにファイルを別のに使用される呼び出し例を。
shopt -s extdebugれた後に呼び出された場合にも機能します。関数がを通じて宣言されてevalいる場合、行番号がオフになる可能性があることに注意してください(現在のバグ)。
bash --debugger私が実際に完了したことをトリガするために持っていた定義された補完機能を取得し、それから報告取得しますdeclare -F _vpnc。
@icarusの優れたソリューションは、関数が文字通りに定義されeval、別のファイルの内容の結果ではない場合に機能します(そのファイルevalはソースとして表示されます)。エイリアスのソースファイル、シェルビルトイン(たとえばecho)および実行可能ファイル(バイナリまたは非バイナリ)は出力されません。この情報は一般には利用できないと思います。一部のコマンドは、通常の実行中または信号への応答のいずれかで、ソースファイルを印刷する場合があります(また、それについて真実である場合もあります)。
__git_ps1で定義されている/usr/share/git/git-prompt.shと/usr/share/git/completion/git-prompt.sh私のシステム、アーチLinux上で、それはあなたのために同じであってもよいです。
シェルの開始時に明確にソース指定されたコマンドを探したい場合は、「呼び出し」セクションを参照しman bashてください。他のファイルをソースし、他のファイルをソースする場合があります。
bashか?
$HOME/.bashrcおよびin $HOME/.profileです。参照:linuxfromscratch.org/blfs/view/svn/postlfs/profile.htmlでは、各ファイルがいつどのように調達されるかの詳細について説明しています。
/etc/profile、$HOME/.bash_profile、$HOME/.bash_login、との内容$ENVと$BASH_ENVあなたのリストに追加する必要があります。
で可能ではないようですbashが、zsh次のとおりです。
$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh
find/ locate/ などの汎用ツールよりもシェル構文をよりよく理解できる便利なツールであることだけを示していますgrep。
~/.whateverデフォルトでbash と同じファイルを読み取りません。また、この場合のように共有場所で定義され、再定義されていない関数に対して有用な回答を提供します~/.bashrc。
これを試しましたか?
grep -rnw '/path/to/somewhere/' -e "pattern"
またはここにある他のコマンドのいずれか:
Linuxで特定のテキストを含むすべてのファイルを見つけるにはどうすればよいですか?| スタックオーバーフロー
もっと説明をする必要があるようです。あなたの質問は「」を尋ねます。したがって、次のコマンドを実行すると、bash関数が定義されているすべてのファイルが返されます。
grep -rnw 'Path2Search' -e "#!/bin/bash"
$PATHは、type動作しません。findまたはを使用してみてくださいlocate。locate既存のデータベースを使用するため、はるかに高速になりますが、コマンドが最近インストールされた場合は機能しません。