web-dev-qa-db-ja.com

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

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が何であるかをどのようにして知るのですか?内蔵または外部?

33
sps

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
$ 

では、catを見てみましょう。

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

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

59
John1024

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
46
André Chalella

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

4
Joke Sr. OK

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

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

compgen -b

catechoを確認するには、次のように調べます。

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

あなたは見ることができますcompgen -b | grep catは出力なしで戻ります。つまり、catはシェル組み込みではありません

Visitcompgenが提供する便利なオプションのリスト。


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

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

他の人はすでにcatについて回答しています。echoの問題について説明したいと思います。タイプの-aオプション(すべての一致をリスト)を使用すると、echobothシェル組み込みand外部プログラムであることがわかります。

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

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

2
terdon

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

2
hildred