シェルで呼び出すコマンドが 関数かプログラムかを知りたいのですが。
シェルで呼び出すコマンドが 関数かプログラムかを知りたいのですが。
回答:
場合によります。
コマンドは、組み込み、エイリアス、関数、実行可能ファイル(検索パス内のスクリプトとバイナリ)の複数のカテゴリに分類できます。
コマンドラインでは、これらは単一のフラットな名前空間を占め、オーバーライドが可能になります。プログラムの種類を区別する方法は多数あります。
$ f () { :; }
$ alias a=cat
$ which f
f ()
{
:
}
私たちはそれfが関数であることを知っています。
$ which a
alias a='cat'
/usr/bin/cat
これaはエイリアスです。
$ which yes
/usr/bin/yes
私たちはそれyesがプログラムであることを知っています。
$ builtin echo ; echo $?
0
シェルにはecho組み込みが…
$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1
…しかし、はありませんcat。組み込みまたはエイリアスがあるが、代わりにプログラムの呼び出しを主張する場合は、コマンドの前にバックスラッシュを付けます。
$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
sh -c 'type true; f() { echo x; }; type f'
aの定義はfunction単一の値を返し、何も出力しません。特にシェル関数は、関数の戻り値が非常に制限されているため、非常にうまく機能し、出力やその他の副作用を引き起こす可能性があります。
A commandは、単一のプログラムまたはリンクされたプログラムのグループを実行するなど、何かをするようにコンピュータに指示するためにユーザーによって与えられる指示です。
A programは、コンピューターに与えられ、コンピューターの中央処理装置(CPU)が理解できる一連の命令(コマンド)です。これらの指示は、コンピュータが一連のデータに対して実行する必要がある操作を示します。
そうは言っても、functionsプログラムの論理的なサブセットです。呼び出しは完全にプロセス内です。commandコマンドシェルから実行可能なプログラム(または内蔵シェル)です。コマンドは、タスクを実行する機能を実装します。反対は正しくありません。
chdir()またはsetenv()シェル内で、つまり別の親プロセスを呼び出すことはできません。