所有不同的 Linux 发行版都有相同的命令行吗?我想知道的是同一个命令行适用于各种 Linux 发行版(CentOS、Fedora、Ubuntu 等),或者它们是否都有不同的命令行?
答案1
我选择将此问题解释为有关命令和 shell 在各种 Linux 发行版之间的可移植性的问题。 “命令行”可能意味着“在 shell 提示符下编写的命令”和“shell 本身”。希望这个答案能够解决“命令行”的这两种解释。
大多数 Unix 系统都提供相同的基本实用程序来在 shell 提示符下工作。由于这些实用程序已经标准化,因此它们的工作方式基本上相同。此外,用于编写 shell 命令的语法也是标准化的(循环、重定向、管道、后台进程、变量赋值、引用等)。该标准称为 POSIX 和可以在这里找到(请参阅“Shell 和实用程序”部分)。
在大多数 Unices 上(尤其是在 Linux 上,出于某种原因),标准实用程序已扩展了额外的功能,但 POSIX 标准描述的功能应该予以实施。如果标准实用程序不符合 POSIX 标准,您可能应该提交有关此的错误报告。
特别是,shell 本身经常被扩展以提供更方便的交互体验,或者能够提供更高级的 shell 编程设施。 shell 是一个与其他应用程序一样的应用程序,有多种风格(实现),并且bash
在 Linux 系统上最受欢迎(但它也可以作为 macOS 等系统上的默认 shell,并且可以安装在任何 Unix 上)。zsh
和shellksh
也很流行,并提供不同的扩展集,但都应该至少能够使用通用语法完成 POSIX 标准所说的大部分工作(除非使用扩展,例如特殊类型的数组和更奇特的文件名模式匹配形式等,尽管其中一些在 shell 之间也非常相似)。
至于非标准工具,例如用于执行 POSIX 标准未涵盖的某些特定任务的工具(例如与数据库通信或调整显示器的亮度级别),或者特定于特定 Linux 发行版的工具(可能用于进行包管理)、特定 Linux 发行版的版本或特定硬件架构等,命令的可移植性将取决于支持使用该命令的系统上安装的工具的正确变体和版本工具。
在各种 Linux 发行版中,可用的工具和实用程序种类相当同质,并且可移植性通常很好(但要注意的是,特定于发行版和体系结构的工具可能不同或缺失)。当考虑使用和编写应该在其他类型的 Unix 系统上运行的脚本时,了解哪些扩展是 GNU/Linux 工具和实用程序变体所特有的,以及哪些扩展可以在“通用 POSIX/Unix 系统”上运行就变得更加重要。
答案2
Linux只是一个内核,而不是操作系统,你直接使用的东西,比如命令、GUI程序或漂亮的桌面,都不是由内核提供的,而是由随操作系统分发的用户层组件提供的。
您在 shell 中使用的命令来自 shell 内置函数或外部软件包。根据您安装的软件,它们可以相同或不同。虽然你总是在 shell 中使用命令,但它们实际上与你的 shell 几乎没有任何关系(这甚至适用于 Windows/OS X/*BSD),只需了解你的 shell 是如何工作的。
只是一些发行版会默认为您安装一些常用软件,因此您可以获得一些可用的常用命令。就像您可以ls
在几乎所有发行版上使用一样,因为几乎所有发行版都linux-utils
为您安装了该软件。
在某些发行版中,您可以更自由地选择所需的软件包,在这种情况下,ls
如果您拒绝安装linux-utils
或任何可以提供此命令的软件,您可能无法使用。另请注意,如果不同的软件包提供相同名称的命令,则它们可能会相互冲突。
答案3
命令行的解释方式取决于壳正在运行的程序以及被调用的程序如何解释其参数。
有多种不同的 shell,使用一种 shell 的特定功能的命令行可能无法在另一种 shell 上运行。
也就是说,一般来说,各种 Linux 发行版都至少包含相同的基本 shell,因此如果您可以确保执行相同的 shell,则可以使用相同的命令行。 (这就是为什么在 shell 脚本中通常将所需的 shell 放在第一行)。
编辑
查看旧式的 shell 脚本/etc/init.d
,每个脚本都以
#!/bin/sh
因此,这些需要某种标准 shell,例如在 Debian 上由dash
.为了进行比较,我为自己编写的 shell 脚本以
#!/bin/bash
因为我有时会使用bash
扩展。还有大量其他 shell,请参见例如这里