web-dev-qa-db-ja.com

Linuxのシェル関数はどこに保存されていますか?

最初は、引数として特定のプログラムを指定した後、whichが何も出力しない理由を探していました。 cd

私が見つけたものから ここ 、おそらく私のマシンのcdが関数であり、type cdを実行することで確認されます。

TLDR:しかし、通常のプログラムのように、which$PATH変数のおかげで見つけることができるので、これらの$PATHフォルダー、cdのような関数またはスクリプトはどこに保存されますか?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
11

ユーザー定義関数

通常、bash関数はbash起動スクリプトに永続的に保存されます。

  • システム全体の起動スクリプト:ログインシェルの場合は/etc/profile、インタラクティブシェルの場合は/etc/bashrc
  • ユーザー定義の起動スクリプト:ログインシェルの場合は~/.bash_profile、インタラクティブシェルの場合は~/.bashrc
  • インタラクティブ/ログインシェルの詳細については、INVOCATIONセクションのbash 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では、declaretypesetコマンドに取って代わりました。

declare -f

関数は、bashシェルの存続期間中メモリに存在します。

シェル定義(組み込み)関数

これらは、echoprintfcd:などの一般的な関数です。それらは、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
12
suspectus

シェルfunctionsは、シェルのメモリに(または、おそらく、文書化されていない一時ファイルに)格納されます。シェルが開始するまで(たとえば、CLIにログインするとき、またはxtermなどのシェルウィンドウを開始するとき)、それらが定義されるまで(たとえば、.bashrc.bash_profile、または同様のもの)、シェルが終了するとそれらは存在しなくなります。

cdおよびechotypealiasなどの他の一般的なコマンドは、いわゆる builtins です。

組み込みコマンドはシェル自体に含まれており、シェルによって組み込みコマンドが異なる場合があります。

6
Nifle

スーパーユーザーの質問 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 に感謝します!