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


11

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

私がここで見つけものから、その理由はおそらくcd私のマシン上にあることであり、それはを実行することで確認されますtype cd

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

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

私は得るcd is a shell builtin。シェルのマニュアルページをご覧ください(zsh?)
Xen2050 14

1
unix.stackexchange.com/questions/85249/…をチェックしてください。問題は、特にこの質問のような理由で、使用すべきではないレガシーコマンドであるということです。
ジョー

回答:


12

ユーザー定義関数

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

  • システム全体の起動スクリプト:/etc/profileログインシェルおよび/etc/bashrc対話型シェル用。
  • ユーザー定義の起動スクリプト:~/.bash_profileログインシェルおよび~/.bashrc対話型シェル用。
  • 対話型/ログインシェルの詳細についてmanは、「呼び出し」セクションのbash ページを参照してください。

ユーザー定義のシェル関数は、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;

ユーザー定義関数はbash declareコマンドでリストできますが、他のシェルはまだ使用しますtypeset。bash declareではtypesetコマンドに取って代わりました。

declare -f

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

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

これらは、次のような一般的な機能でありechoprintfcd:。これらは、bash実行可能ファイルにリンクされるライブラリにコンパイルされます。定義を実行可能ファイルに組み込むと、外部定義をロードするのに比べて時間が節約されます。これらの関数の定義(.defCソースに解析されるソースファイルに保持)はbuiltins、bashソースのディレクトリに保持されます。

便利なこと:シェルの組み込みコマンドの使用については、を使用してくださいhelp <command>。例えば

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

その抜粋の答えをありがとう。これはまさに私が探していたものです。bash関数の作成プロセスやtypeset、関数の作成/変更の原因となったファイル/スクリプトを示すようなものを追跡するツールがあると思いますか?
ガブリエルシムノヴィッチ

このようなツールは知りません。関数定義のソースファイルを表示するためのdeclareor typesetコマンドの便利なオプションです。これはソフトウェアエンジニアリングの問題だと思います。最近、.aliasファイルで定義されたシェル関数を見つけました-私が期待していたものではありません!
容疑者14

8

シェル関数は、シェルのメモリ(または、おそらく文書化されていない一時ファイル)に保存されます。彼らは(あなたがCLIにログインするか、のようなシェルウィンドウを起動したときなど、シェルが起動するまで、任意の使用可能な形で存在していないxterm)、それらは(例えば、読むことによって定義され.bashrc.bash_profile類似の、または何かを)し、それらが中止しますシェルの終了時に存在します。


1
プロンプトで入力する何かのはかない性質は重要です。私の投票はこの答えに行きます。あなたが入力した場合cd () { pwd; builtin cd "$@"; }、プロンプトで、次に保存されている唯一の場所は、あなたの現在実行中のシェルのメモリです。(私の例はBashですが、同じ原則がどのシェルにも適用されます。)
tripleee 14

6

cdおよびechotype&などの他の一般的なコマンドaliasは、いわゆる組み込みコマンドです。

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


4
組み込みコマンドの実行可能コードcdがシェルプログラム自体に含まれていることを強調する価値があるかどうかはわかりません。たとえば/bin/bash、シェルの場合はファイル内に含まれます。(ここでのあなたの言葉遣いは明確だと思いますが、人々はあらゆるものに混乱するのを見てきました。)
デビッドZ 14

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.