シェルコマンドがプログラムまたは関数であることを確認する方法は?


8

シェルで呼び出すコマンド関数プログラムかを知りたいのですが。


1
「小さなプログラム」と「関数」をどのように区別していますか?
JdeBP 2018

シェルプログラムにコマンドを入力して、機能するようにシェルをプログラムし、シェルがプログラムされている機能を利用してコマンドを取得し、シェル関数から他のプログラムをコマンドすることができます。
txtechhelp 2018

回答:


15

場合によります。

コマンドは、組み込み、エイリアス、関数、実行可能ファイル(検索パス内のスクリプトとバイナリ)の複数のカテゴリに分類できます。

コマンドラインでは、これらは単一のフラットな名前空間を占め、オーバーライドが可能になります。プログラムの種類を区別する方法は多数あります。

$ 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

3
また、* nixのある実装ではプログラムであるコマンドは、別の実装ではシェル組み込み(=関数)になる可能性があります。
jamesqf 2018

1
@jamesqf、ええ、シェルには標準のツールが組み込まれていますが、組み込みコマンドは関数とは異なります。実行例sh -c 'type true; f() { echo x; }; type f'
ilkkachu '13

5
一般的に、typewhichほとんどすべての目的に適しています。unix.stackexchange.com/q/85249/135943を
ワイルドカード

@ilkkachu:それは、「同じ」の定義に依存します。もちろん、それらは異なる方法で実装されますが、コマンドを入力する通常のユーザーにとっては、機能的には同じです。
jamesqf 2018

1
@jamesqfは、通常のユーザーが関数を使用していない(その方法を知っている)場合でも、組み込み関数と同じであると主張することは混乱を招くだけです。
ilkkachu 2018

4

aの定義はfunction単一の値を返し、何も出力しません。特にシェル関数は、関数の戻り値が非常に制限されているため、非常にうまく機能し、出力やその他の副作用を引き起こす可能性があります。

A commandは、単一のプログラムまたはリンクされたプログラムのグループを実行するなど、何かをするようにコンピュータに指示するためにユーザーによって与えられる指示です。

A programは、コンピューターに与えられ、コンピューターの中央処理装置(CPU)が理解できる一連の命令(コマンド)です。これらの指示は、コンピュータが一連のデータに対して実行する必要がある操作を示します。

そうは言っても、functionsプログラムの論理的なサブセットです。呼び出しは完全にプロセス内です。commandコマンドシェルから実行可能なプログラム(または内蔵シェル)です。コマンドは、タスクを実行する機能を実装します。反対は正しくありません。


10
「関数は単一の値を返し、何も出力しません」-ええと、ええ、おそらく数学的な意味で。しかし、命令型プログラミング言語では、「関数」が単に何かを実行できるサブルーチンを意味するのが一般的です。また、特にシェル関数は、関数の戻り値が非常に制限されているため、出力やその他の副作用が発生する可能性があります。
ilkkachu 2018

@ilkkachu。ありがとうございました。答えを更新しました。自由に修正してください;-)

3
これらの定義は、シェルのコンテキストではなく、プログラミング言語のコンテキストからのものだと思います。はい、私はシェル言語プログラミング言語であることを知っていますが、「関数」の考え方は数学またはコンピューターサイエンスの定義とはかなり異なります。シェルでは、すべてのコマンド(組み込み、関数、エイリアス、プログラム、スクリプト)が機能します同様に、単に異なる種類の実装です。
Toby Speight 2018

1
... *ほぼ*同様; ビルトインはシェル自体の状態を変更できますが、外部プログラムはシェル内で、chdir()またはsetenv()シェル内で、つまり別の親プロセスを呼び出すことはできません。
チャールズダフィー

1

シェルで呼び出すコマンドが関数なのかプログラムなのか知りたいのですが。

はい。

具体的には、テキストを入力してを押すenterと、シェルはそれが次のいずれであるかを判断する必要があります。

  1. alias
  2. 機能、
  3. 組み込みコマンド
  4. 実行可能ファイル。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.