如何知道什么是命令、系统调用、bash 内置函数等?

dot*_*hen 3 command-line terminology

最近有同事问“什么是man”?在得知并非所有可从 Bash CLI 访问的内容都是命令后,我对调用man命令持谨慎态度。

man man只是称其为接口:

NAME
       man - an interface to the on-line reference manuals
Run Code Online (Sandbox Code Playgroud)

man有一个可执行文件:

$ which man
/usr/bin/man
$ file /usr/bin/man
/usr/bin/man: ELF 64-bit LSB shared object
Run Code Online (Sandbox Code Playgroud)

man程序也是如此吗,因为它有可执行文件?还可以是哪些其他名词man?什么名词最能描述它?真的,我对如何确定任意值是什么的一般情况感兴趣,这只是一个例子。thing on the climan

就此而言,可以在 Bash CLI 上使用的所有内容用什么词来表示?一个包含命令、别名、系统调用等的词?

Ste*_*itt 9

用 POSIX 术语来说,任何可以要求 shell 做某事的东西都是命令:

\n
\n

指示 shell 执行特定任务的指令。

\n
\n

所以

\n
man man\n
Run Code Online (Sandbox Code Playgroud)\n

是一个命令,按原样(技术上)

\n
man\n
Run Code Online (Sandbox Code Playgroud)\n

man也是一个实用程序:

\n
\n

一种程序,不包括作为 Shell 命令语言的一部分提供的特殊内置实用程序,可以从 shell 中按名称调用该程序来执行特定任务或相关任务集。

\n
\n

(这里排除\xe2\x80\x99并不重要;提到它\xe2\x80\x99是因为特殊的内置实用程序具有特定的属性。)

\n

要找出给定命令是什么,请使用type. 这将告诉您它是否\xe2\x80\x99是内置的,或者是一个程序(PATH以及在哪里),或者是一个别名等(或未知)。

\n

请注意,系统调用\xe2\x80\x99 不能用作 shell 命令。

\n

另请参阅它们是命令还是实用程序?内置命令和非内置命令之间有什么区别?

\n


MC6*_*020 5

从最底层开始:

系统调用

系统调用是用户态任务(必须)用来从内核请求某些服务并运行到特权内核模式的方式。

例如,假设您的编程语言是 C,并且您希望任务更改其当前目录,则需要在程序中插入chdir()指令。

当然,这些过程不能立即从命令行访问。vg 在命令行中输入 chdir 不会调用 chdir 系统调用。

所有可用系统调用的列表当然取决于内核,唯一可靠的来源当然是include/linux/syscalls.h内核源代码发行版的头文件。

指示

CLI 是您正在运行的任务的界面。无论您输入什么,都被称为指令,因为它应该指示任务完成某些操作。

命令

您输入的内容将首先通过解释器,该解释器将对您输入的标记执行一些词法分析,并且在 shell 的特定情况下,可能会识别命令的名称(理解为不是变量赋值)并顺便决定它需要诉诸另一个程序才能实现您的请求。然后它将派生一个子进程,该子进程将执行另一个程序的二进制文件。

但在某些特殊情况下,任务可能会更容易地满足请求,而无需借助外部程序(例如简单的微积分),或者更重要的是,必须在内部执行您的请求。

内置命令

回到我们最初更改活动目录的意愿,用户将发出众所周知的 shell 命令cd。用户真正想要的是更改其 shell 的当前目录。而且由于 chdir 系统调用仅更改调用者的当前工作目录,因此 shell 无法派生另一个不会对其父级进行任何更改的进程。shell 必须在内部执行 chdir 系统调用。

所有手册页中都列出了 shell 内置命令yourshellname。

别名

别名只不过是任何用户都可以设置的同义词,并且将由命令行解释器翻译成所需的字符串(应该代表 shell 的任何合法指令。)

通过 shell 内置alias命令可以获得所有当前活动别名的列表。