web-dev-qa-db-ja.com

コマンド対プログラム?

私はadduseruseraddの違いを調べていました 説明useraddがコマンドであるのに対し、adduserはPerlスクリプト。私はPerlスクリプトが何であるかを理解していますが、私が理解していないのはcommandが正確に何であるかです。

lslncdなどのコマンドはすべて、1つのことを行う言語で書かれた単純なプログラムであるといつも思っていました。これらの「単純なプログラム」とPerlスクリプトの違いは何ですか?

もちろん、(Perl)スクリプトはコンパイルされず、実行時に解釈されることは知っていますが、それだけが違いではないでしょうか?

19
kramer65

簡単に言えば、コマンドはコンピュータによって実行される命令(または命令のセット)です。

スタンドアロンコマンド

lslnなどの基本的なUnixユーティリティは(通常)Cで記述され、スタンドアロンの実行可能プログラムprogramsとしてコンパイルされます。実行されるインタプリタ。通常、特定のライブラリファイルをシステムにインストールする必要がありますが、これは別の質問に対する答えです。

スクリプト

スクリプトはコマンドのコレクションであり、実際、スクリプト自体はコマンドと見なされます。

PerlスクリプトはPerlステートメントのシーケンスであり、Perl実行可能ファイル(スタンドアロンおよびコンパイル済み)プログラムPerlステートメントを解釈します。

大きくて複雑な解釈スクリプト(Perlなどの言語では、PythonおよびRuby))は解釈済みプログラムと呼ばれることもありますが、scriptは、短くて単純なスクリプト用に予約されています。

Shellスクリプトは、他のコマンド(任意のタイプのコマンド)のシーケンスであり、スクリプトを解釈するにはBashなどのUnixシェルが必要です。 Bashのmanページから:

Bashは、標準入力またはファイルから読み取ったコマンドを実行するsh互換のコマンド言語インタープリターです。

シェル組み込み

シェルには通常、スタンドアロンプ​​ログラムでもスクリプトでもないbuilt-inコマンドがあります。代わりに、それらはシェル自体の一部であり、シェルによって直接実行されます。 cdは、このような組み込みコマンドの例です。

場合によっては、シェル組み込みコマンドとして同時に存在するコマンドと、スタンドアロンコマンドとして同時に存在するコマンドがあります(例:echoコマンド)。

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

echoはそれ自体で組み込みのシェルを実行しますが、完全なパスを指定することでスタンドアロンコマンドを実行できます。

Echoの組み込みバージョンを実行します。

$ echo --version
--version

スタンドアロンechoプログラムを実行します。

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注:上記の詳細はUnix環境に関するものですが、Windows環境にも同じ原則が適用されます。

32

組み込みコマンドはシェルの一部です。プログラムはシェルによって実行されます。

組み込みコマンドはシェル自体に含まれています。組み込みコマンドの名前が単純なコマンドの最初の単語として使用される場合( 単純なコマンド を参照)、シェルは別のプログラムを呼び出さずにコマンドを直接実行します。組み込みコマンドは、個別のユーティリティで取得することが不可能または不便な機能を実装するために必要です。

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands

2
Steven

コマンドは、アプリケーションまたはシステムに何かを行うように伝える方法を意味します。

アプリケーションは通常、GUIまたはstdinからのさまざまなコマンドを受け入れますが、他の方法も可能です。 UNIXソケットまたは名前付きパイプ、ある種のWeb API、RPC接続、またはその他のカスタムプロトコル。

1つのことだけを実行し、通常はGUIなしで終了するアプリケーションも、このアプリケーションに意味のある「コマンド」を1つだけ「与える」ことができるため、コマンドと呼ぶこともできます。これは、lsのような小さなプログラムがどのように機能するか、およびそれらがコマンドと呼ばれる理由です。

しかし、Photoshopをコマンドとは呼びませんが、GUIを介してPhotoshop内でコマンドを発行します。

ただし、この用語は人によって意味が異なる場合があります。あなたの例では、commandは、スクリプトインタープリターが機能する必要があるファイルではなく、直接実行される実行可能ファイルを記述するために使用されています。 Perlスクリプトを実行している場合、/usr/bin/Perlは実際に実行されているバイナリであるため、区別が重要になる可能性があります(したがって、長時間実行されているPerlスクリプトを強制終了する場合は、ps)。ただし、ほとんどのシェルには、シェル自体へのコマンドである「組み込み」コマンドがあり、外部の実行可能ファイルを実行しません。たとえば、cdbash自体によって処理され、/sbin/cdなどを呼び出しません。

1
LawrenceC