一位同事最近问“什么是man
”?在得知并非所有可从 Bash CLI 访问的东西都是命令后,我很谨慎地调用man
命令。
man man
只是称它为接口:
NAME
man - an interface to the on-line reference manuals
man
有一个可执行文件:
$ which man
/usr/bin/man
$ file /usr/bin/man
/usr/bin/man: ELF 64-bit LSB shared object
程序也是如此man
,因为它有一个可执行文件?其他名词可以man
是什么?用什么名词来形容呢?真的,我对如何确定任意是什么的一般情况感兴趣,这只是一个thing on the cli
例子man
。
就此而言,可以在 Bash CLI 上使用的所有东西是什么词?一个包含命令、别名、系统调用等的词?
在 POSIX 术语中,任何可以要求 shell 做某事的东西都是命令:
所以
是一个命令,原样(技术上)
man
也是一个实用程序:(这里的排除并不重要;之所以提到它,是因为特殊的内置实用程序具有特定的属性。)
要找出给定命令是什么,请使用
type
. 这将告诉您它是内置的,还是PATH
(以及在哪里)上的程序,或别名等(或未知)。请注意,系统调用不能用作 shell 命令。
另请参阅它们是命令还是实用程序?内置命令和非内置命令有什么区别?
从最低层开始:
系统调用
系统调用是用户态任务(必须)用来从内核请求某些服务并运行到特权内核模式的方式。
例如,假设 C 是您的编程语言,并且您希望您的任务更改其当前目录,您需要在程序中插入chdir()指令。
当然,这些过程不能立即从命令行访问。vg 在命令行输入 chdir 不会调用 chdir 系统调用。
所有可用系统调用的列表当然取决于内核,唯一可靠的来源当然是
include/linux/syscalls.h
内核源代码分发的头文件。指示
CLI 是您正在运行的任务的接口。您输入的任何内容都称为指令,因为它应该指示任务完成某些操作。
命令
您键入的内容将首先通过解释器,该解释器将对您键入的标记执行一些词法分析,并且在 shell 的特定情况下,可能会识别命令的名称(理解为不是变量赋值)并顺便决定它需要求助于另一个程序才能满足您的要求。然后它将派生一个子进程,该子进程将执行该其他程序的二进制文件。
但是在某些特殊情况下,任务可能更容易满足请求,而无需借助外部程序(例如微积分),或者更重要的是,必须在内部执行您的请求。
内置命令
回到我们最初更改活动目录的意愿,用户将发出众所周知的 shell 命令
cd
。用户真正想要的是改变他的 shell 的当前目录。而且因为 chdir 系统调用只改变调用者的当前工作目录,shell 不能派生另一个不会改变其父进程的进程。shell 必须在内部执行 chdir 系统调用。yourshellname
所有手册页中都列出了 shell 内置命令。别名
别名只不过是任何用户都可以设置的同义词,并将由命令行解释器翻译成所需的字符串(应该代表对 shell 的任何合法指令。)
alias
借助 shell 内置命令,可以获得所有当前活动别名的列表。我有一个小的 shellscript,可以帮助我识别命令:它是什么类型的命令,如果通过程序包安装,是哪个包。也许用名字
what-about
,有时有两种选择,例如 for
echo
,一个单独的编译程序和 shell 内置命令。除非您使用单独程序的完整路径,否则内置的 shell 将获得优先权并被使用,有时命令链接到可能隐藏的程序,例如
rename
我使用的版本,为了避免错误,我有一个别名
rm
,并且别名优先于PATH
. 您可以使用反斜杠作为前缀,\rm
以跳过别名并直接运行程序。(请记住,别名仅适用于特定用户,而不适用于sudo
其他用户,除非他们定义了类似的别名。)