「cat」は組み込みのシェルですか、外部プログラムですか?


33

typeコマンドを使用してcat、シェルが組み込みか外部プログラムかを調べると、以下の出力が得られます。

-$ type cat
cat is hashed (/bin/cat)
-$

catこれは外部プログラムであることを意味し/bin/catますか?

私が混乱したのは、以下の出力を確認したときにecho、それがbuilt-inプログラムであることがわかったからです/bin/echo

-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$ 

したがって/bin/cat、エコーは/bin/echo組み込みであるため、必ずしも外部プログラムを意味するロジックを使用できませんでした。

だから私はどのように私が知ってcatいますか?組み込みまたは外部?


1
-コマンドcatは、システムの一部を構成する外部プログラムです。原因として、実行できる多くのアクションは単純なビルトインではありません。
ジョークシニアOK

12
type which答えwhichを出せない理由
ドゥブ

1
使用しているシェルによって異なります
-nsn

6
楽しい事実:両方catlsは、ストールマン自身によって書かれました。彼が書いたものがどれだけあるかに驚くでしょう。彼が今日すべてとすべてのコアutilsをコンパイルする世界で最高のコンパイラであるコンパイラの最初のバージョンを書いたことを忘れないでください。Just sayin '
アレックティール

2
@AlecTealほとんどのUnixシステムは、リチャード・ストールマンが手に入れたGNUバージョンよりもずっと前のバージョンのlsとcatを使用していることを知っていますか?
ロス・リッジ

回答:


59

typeシェルが使用するものを示します。例えば:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

つまり、bashプロンプトでを入力echoすると、ビルトインが取得されます。のようにパスを指定/bin/echoすると、外部コマンドが取得されます。

which対照的に、シェルが何をするかについての特別な知識を持たない外部プログラムです。debianライクシステムでwhichは、実行可能ファイルのPATHを検索するシェルスクリプトです。したがって、シェルが組み込みを使用する場合でも、外部実行可能ファイルの名前が表示されます。

コマンドが組み込みとしてのみ使用可能な場合、which何も返しません。

$ type help
help is a shell builtin
$ which help
$ 

sの表情で、今を、聞かせてcat

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat シェル組み込みではなく、外部実行可能ファイルです。


5
type -all echoシェルに既知の異なる「エコー」である(順番に)を見つけることができます(最初のシェルは、呼び出し"echo"\echo、またはなどの順序を変更するものを指定しない場合、シェルが呼び出すものですcommand echo
オリビエデュラック

いい答えだ。さらにecho、歴史的な理由から2つのバージョンがあります。それは外部コマンドとして始まり、組み込みとして追加されました。Bourneシェルの初期バージョン(/bin/sh)にはありませんでした。/bin/echoあらゆる種類のものがそれに依存していたため、互換性のために維持されました。(同じことが起こったtest。)
アレクシス

サイドノート:whichそれ自体はシェル組み込みコマンドである場合があります、例えばtcshで:which which which: shell built-in command.
Dan Cornilescu

私はパーティーに遅れて到着したんだけど、なぜあなたはそのmanページをチェックしないと、あなたが実際にそれが内蔵されたか、どんなシェルであるかどうかを示す括弧の間の数字、見ることができます
poz2k4444

46

cat is hashed (/bin/cat)のようなものですcat is /bin/cat(つまり、外部プログラムです)。

違いはcat、このセッションで既に実行されているため、bashは既にそれを検索し$PATH、結果の場所をハッシュテーブルに格納しているため、このセッションで再度検索する必要はありません。

セッションでハッシュされたすべてのコマンドを表示するには、次を実行します hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
実際、私の意見では、これがあなたの質問に答える唯一の答えです:)
アンドレチャレラ

私見この^^^は本当です。この答えは受け入れられるべきです。
LinuxSecurityFreak

4

シェル組み込みのリストをチェックする別の方法:使用 compgenシェル組み込み自体する!

次のコマンドは、すべてのシェル組み込みコマンドをリストします。

compgen -b

次のようにgreping することでcat、を確認できますecho

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

あなたはcompgen -b | grep cat出力なしでリターンを見ることができます、平均catはシェル組み込みではありません

提供する便利なオプションのリストをご覧くださいcompgen


別の組み込みコマンドを使用helpして、シェル組み込みを表示することもできます。

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

これらのオプションの正式なドキュメントが見つかりません。それがどこにあるか知っていますか?
Random832

@ Random832のオプションについて話していますcompgenか?
パンディア

ええ、-bまたは他のオプションの半分が何を意味するかについて、Bashのマンページには何も見つかりませんでした。後でgnu.org/software/bash/manual/html_node/で
Random832

@ Random832を試してみるとman bash | grep -e '-A action$' -A 32、おそらくこのような出力が得られます。(-A適切に管理するために数字を増減します)。
パンディア

4

whereisマニュアルページライブラリなどのように、コマンドがマシン上のどこにあるかを示すため、より効率的なコマンドを使用することもできます。


私はちょうど良いが、使用していないと学習ので、私の悪い英語のために私を-Excuse ...!
ジョークシニアOK

2

他の人はすでに答えていますcat、私はただで問題を説明したいechoです。あなたはタイプの使用している場合は-aオプション(リストすべてのマッチを)、あなたはそれが表示されますechoされ、両方のシェルの組み込み外部プログラム:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

2つは互いに完全に独立しています。typeオプションを指定しないと、最初に見つかった一致するコマンドが返されます。したがって、をfoo実行すると実行される内容がtype に表示されますfoo。他のオプションもありますが、を使用しない限り表示されません-a


2

ここでは、typeを使用してなどのコマンドcatが組み込みまたは外部プログラムであるかどうかを確認するためのいくつかの良い答えがあるためです。もっと一般的なアプローチを取ります。現在のシェルに影響を与えるため、組み込みコマンドである必要があるコマンドがいくつかあります。三つの典型的な例でありcdexecexit。それらの機能はexecveまたはシステムコールの動作に依存するため、組み込みしてはならないコマンドがいくつかあります。このようなプログラムの例としてはsusudocalifesuper。他のすべてのコマンドは、ビルトインまたは外部プログラムとして構築できます。cat組み込みとしてシェルを含むシェルと含まないシェルがあるため、このクラスの優れたサンプルプログラムです。ビルトインとして使用できるこのクラスの多くのコマンドは、外部プログラムとしても使用できることに注意してください。

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