命令与程序?


19

我一直在寻找adduser和之间的区别useradd,并且一个解释是,这useradd是一个命令,同时adduser是一个perl脚本。我了解什么是perl脚本,但我不了解的是a command确切的含义。

我一直以为,命令一样lslncd等都是写在任何语言中所有简单程序,简单地做一两件事。这些“简单程序”和perl脚本之间有什么区别?

我当然知道(perl)脚本不是编译而是在运行时解释的,但是我猜那不是唯一的区别吗?


1
在这种情况下,不要过多地关注编译和解释。您可能有一个解释过的外壳程序(尽管您为什么想要一个外壳是有问题的)。相反,请注意以下事实:命令操作的代码是Shell源代码的静态部分,而脚本是外部的,不应假定该脚本存在,或者在两个略有不同的系统上的行为完全相同,并且可能甚至不必满足其所有依赖性。脚本更灵活,因此,通常来说可靠性较差,而命令将在Shell可以运行的任何地方运行。
弗兰克·托马斯

简而言之:命令是可以执行的任何东西,而程序是可以执行的二进制文件。
2015年

Answers:


32

简而言之,命令是计算机要执行的一条指令(或一组指令)。

独立命令

基本Unix工具,如lsln等(通常)用C语言编写,并编译成独立的可执行程序不需要解释器来执行; 他们通常需要某些图书馆在系统上安装文件,但这是另一个问题的答案。

剧本

脚本是命令的集合,实际上,脚本本身被视为命令。

一个Perl脚本是Perl语句的顺序和需要perl的可执行文件(单机和编译)程序来解释Perl语句。

有时,大型而复杂的解释性脚本(在Perl,Python和Ruby等语言中)也被称为解释程序,而术语“ 脚本”则保留给较短和较简单的脚本。

壳脚本是其他的命令序列(任何类型的命令),并且它需要一个Unix外壳诸如击解释脚本。在Bash手册页中:

Bash是sh兼容的命令语言解释器,它执行从标准输入或文件读取的命令。

外壳内置

Shell通常具有内置命令,这些命令既不是独立程序也不是脚本。相反,它们是Shell本身的一部分,并直接由Shell运行。cd是此类内置命令的示例。

有时,有些命令既可以作为shell内置命令存在,也可以作为独立命令同时存在,例如,该echo命令。

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

echo 它可以自行执行内置的Shell,而可以通过提供其完整路径来执行独立命令。

运行内置版本的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环境。


仅当您安装Cygwin时,您在Windows中引用的回显。您不会在Windows中找到echo。*,因为它纯粹是CMD Shell命令(powershell中的echo是别名写对象)
Jim B

@JimB是的。我编辑了最后一行以阐明我的意思。碰巧的是,我本周才刚刚开始学习PowerShell(幸运的是,我已经.bat很多年没有使用文件了)。
安东尼G-莫妮卡的正义

2

内置命令是外壳程序的一部分。程序由外壳执行。

内置命令包含在外壳本身内。当将内置命令的名称用作简单命令的第一个单词时(请参见Simple Commands),shell将直接执行该命令,而无需调用其他程序。内置命令对于实现使用单独的实用工具无法获得或不方便的功能是必需的。

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


但是useradd不是内置的shell。该网站只是说“命令”,而不是“内置命令”。这种解释与这个问题有什么关系?
巴尔(Barmar)

1

命令只是一种告诉应用程序或系统做某事的方法。

应用程序通常会从GUI, stdin但是其他方法也是可能的,例如UNIX套接字或命名管道,某种Web API,RPC连接或某些其他自定义协议。

一个只做一件事然后退出的应用程序(通常没有GUI)也可以称为命令,因为您实际上只能“给”该应用程序一个有意义的“命令”。小程序就是这样ls工作方式,以及为什么将它们称为命令。

但是您不会将Photoshop称为命令,但是您肯定会通过GUI在其中发出命令。

但是,该术语对不同的人可能具有不同的含义。在您的示例中,命令用于描述直接运行的可执行文件,而不是需要脚本解释器才能工作的文件。区别很重要,因为当您运行Perl脚本时,/usr/bin/perl实际上是正在运行的二进制文件(因此,如果您想杀死运行时间较长的Perl脚本,则必须在其中查找ps)。但是,大多数外壳程序都具有“内置”命令,这些命令是对外壳程序本身的命令,不会导致外部可执行文件运行。例如,它cd是由bash自身处理的,它不会调用/sbin/cd或类似。


有趣的观点。从抽象的角度来看,我很想将其称为“调用”或“手势”,甚至将android术语称为“意图”。那就是说,我不知道我是否喜欢使编译与解释成为标准的想法。例如,Powershell是混合解释(.Net),但作为Shell,它在其代码库中具有命令。但是您可以很好地了解外部编译的(机器代码)可执行文件不同于脚本,也不同于命令。正如我所说,有趣的观点。
Frank Thomas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.