typeコマンドは、実行可能なコマンドとシェルスクリプトを区別できません。

typeコマンドは、実行可能なコマンドとシェルスクリプトを区別できません。

だから本を読んでいました。Linuxのコマンドライン、コマンドには4つのタイプがあることがわかります。

(1) 実行可能プログラム

(2) シェル内蔵機能

(3) シェル機能(シェルスクリプト)

(4) エイリアス

次に、コマンドのタイプを識別するためにそのtypeコマンドを使用できると言います。

しかし、このtypeコマンドはシェル機能(シェルスクリプト)と実行可能なコマンドを区別できないことがわかりました。

たとえば、

type cp
(will output: cp is /bin/cp)

type bzexe
(will output: bzexe is /bin/bzexe)

しかし、私たちは皆、それがcp実行可能なプログラムであり、bzexeシェルスクリプトであることを知っています。

今私の質問は:この2つを区別するためにどのコマンドを使用できますか?

私はこのコマンドを知っていfileてうまくいきます。これが唯一の解決策ですか?

答え1

シェルスクリプトはい実行可能なプログラムです。だからtype一つだそうです。シェルスクリプトは、Linux経由で実行されるPerlスクリプト、Pythonスクリプト、デフォルトのELF実行可能ファイル、Qemuクロスアーキテクチャ実行可能ファイルなどの実行可能なコマンドです。binfmt_miscすべての実行可能ファイルは、使用するインタプリタに関係なく実行可能なコマンドです。

私の例のリストからわかるように、「スクリプト化された」と「スクリプトされていない」の間の境界はあいまいです。シェルボーンスクリプトですが、ネイティブコードでもスクリプトでもない実行ファイルもあります。

プログラムを実行するときにどの言語で書かれたかは問題ではありません。だからtypeこの事実を言っても役に立ちません。これがすることは、typeシェルの観点からどのような種類のコマンドなのかを教えるだけです。

シェルスクリプトは関数とは異なります。関数はシェルの内部で実行され、シェル環境を変更できます。シェルスクリプトは別のプログラムです。この別のプログラムは、現在実行中のプログラムと同じ言語で書くことができますが、これはただ偶然です。

答え2

必要なコマンドはですfile

type /bin/bash
/bin/bash is /bin/bash

file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, stripped

type /bin/zcat
/bin/zcat is /bin/zcat

file /bin/zcat
/bin/zcat: POSIX shell script, ASCII text executable

編集:申し訳ありません。ちょうど投稿の最後の行を読みました。 file唯一のオプションではありませんが、おそらく最善でしょう。同様の方法を使用してファイルがプレーンheadテキストかバイナリかを確認することもできますが、これはすぐに混乱する可能性があります。 :)

関連情報