だから本を読んでいました。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
テキストかバイナリかを確認することもできますが、これはすぐに混乱する可能性があります。 :)