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
が何であるかをどのようにして知るのですか?内蔵または外部?
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
は、シェルの組み込みではなく、外部の実行可能ファイルです。
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
コマンドwhereis
を使用することもできます。これは、マニュアルページライブラリなどのように、コマンドがマシン上のどこにあるかを示すためです。
シェル組み込みのリストをチェックする別の方法:シェル組み込みであるcompgen
を使用する!
次のコマンドは、すべてのシェル組み込みコマンドをリストします。
compgen -b
cat
、echo
を確認するには、次のように調べます。
$ 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.
他の人はすでにcat
について回答しています。echo
の問題について説明したいと思います。タイプの-a
オプション(すべての一致をリスト)を使用すると、echo
がbothシェル組み込みand外部プログラムであることがわかります。
$ type -a echo
echo is a Shell builtin
echo is /bin/echo
2つは互いに完全に独立しています。オプションなしのtype
は、最初に一致したコマンドを単に返します。したがって、foo
と入力すると、foo
を実行した場合に実行される内容が表示されます。他のオプションがあるかもしれませんが、-a
を使用しない限り、それらは表示されません。
Typeを使用してcat
などのコマンドが組み込みプログラムであるか外部プログラムであるかを確認することについては、ここでいくつかの良い答えがあるので。私はより一般的なアプローチを取るつもりです。現在のシェルに影響を与えるため、組み込みコマンドでなければならないコマンドがいくつかあります。 3つの典型的な例は、cd
、exec
、およびexit
です。コマンドの機能はexecveまたはシステムコールの動作に依存するため、組み込みであってはならないコマンドがあります。このようなプログラムの例には、su
、Sudo
、calife
、super
があります。他のすべてのコマンドは、組み込みまたは外部プログラムとして構築できます。 cat
は、組み込みとして組み込むシェルと組み込まないシェルがあるため、このクラスの優れたサンプルプログラムです。ビルトインとして使用できるこのクラスのコマンドの多くは、外部プログラムとしても使用できることに注意してください。