最初は、引数として特定のプログラムを指定した後、which
が何も出力しない理由を探していました。 cd
。
私が見つけたものから ここ 、おそらく私のマシンのcd
が関数であり、type cd
を実行することで確認されます。
TLDR:しかし、通常のプログラムのように、which
が$PATH
変数のおかげで見つけることができるので、これらの$PATH
フォルダー、cd
のような関数またはスクリプトはどこに保存されますか?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
通常、bash関数はbash
起動スクリプトに永続的に保存されます。
/etc/profile
、インタラクティブシェルの場合は/etc/bashrc
。~/.bash_profile
、インタラクティブシェルの場合は~/.bashrc
。man
ページを参照してください。ユーザー定義のシェル関数は、bashの起動時にハッシュ(またはルックアップテーブル)に動的に読み込まれます。 bashソースファイルvariable.c
から、テーブルの定義は次のとおりです。
/* The list of Shell functions that the user has created, or that came from
the environment. */
HASH_TABLE *Shell_functions = (HASH_TABLE *)NULL;
ユーザー定義関数はbashdeclare
コマンドでリストできますが、他のシェルは引き続きtypeset
を使用します。 bashでは、declare
がtypeset
コマンドに取って代わりました。
declare -f
関数は、bashシェルの存続期間中メモリに存在します。
これらは、echo
、printf
、cd
、:
などの一般的な関数です。それらは、bash
実行可能ファイルにリンクされているライブラリにコンパイルされます。定義を実行可能ファイルに組み込むと、外部定義をロードする場合に比べて時間を節約できます。これらの関数の定義(Cソースに解析される.def
ソースファイルに保持)は、bashソースのbuiltins
ディレクトリに保持されます。
便利な脇:シェルの組み込みコマンドについては、help <command>
を使用してください。例えば.
help # list all builtins
help declare # info and options for declare
help -m declare # gives man style information for declare
シェルfunctionsは、シェルのメモリに(または、おそらく、文書化されていない一時ファイルに)格納されます。シェルが開始するまで(たとえば、CLIにログインするとき、またはxterm
などのシェルウィンドウを開始するとき)、それらが定義されるまで(たとえば、.bashrc
、.bash_profile
、または同様のもの)、シェルが終了するとそれらは存在しなくなります。
cd
およびecho
、type
、alias
などの他の一般的なコマンドは、いわゆる builtins です。
組み込みコマンドはシェル自体に含まれており、シェルによって組み込みコマンドが異なる場合があります。
スーパーユーザーの質問 bash関数の定義を見つける は、これと密接に関連しています。ユーザー HairOfTheDog 提供 この回答 (言い換え):
次のコマンドは、関数の定義の場所(ファイル名と行番号)を報告します。
foo
という名前の関数を想定すると、# Turn on extended Shell debugging shopt -s extdebug # Display the function’s name, line number and fully qualified source file declare -F foo # Turn off extended Shell debugging shopt -u extdebug
たとえば、これらのコマンドの出力は次のようになります。
foo 32 /source/private/main/developer/cue.pub.sh
上記はbash
でのみ機能し、一般にPOSIXシェルでは機能しない可能性があります。
これを見つけてくれて Blue Raspberry に感謝します!