这最后答案理解了什么是 Linux 中的二进制文件或配置文件,这很好。那么问题是,为什么我们需要为 ls 命令创建二进制文件或为 Linux 系统创建其他二进制配置文件。就像我们创建配置文件来执行特定任务一样,为什么我们不为 ls 命令和其他二进制文件创建配置文件。
答案1
我认为你不仅困惑于配置文件和二进制文件,还有关于配置文件和脚本。让我展示一个非常简单的例子,从配置文件:
配置文件hello.conf
WHAT=World
这个简单的文本文件仅设置了一个配置变量。它将变量设置WHAT
为值World
。
现在考虑一个简单的脚本文件使用在配置文件 hello.conf
。
脚本文件hello.sh
#!/bin/bash
source hello.conf
echo "Hello, $WHAT"
第一行告诉操作系统如何处理此文件。在这种情况下,它将由程序运行/bin/bash
。bash
知道我们在此脚本中使用的语法并采取相应的行动。也就是说:它来源(=读)我们的配置文件 hello.conf
然后就可以使用我们在该文件中所做的所有定义。接下来,它会回显字符串,后面跟着配置文件中Hello,
变量的内容。如果我们运行该脚本,我们会得到:$WHAT
user@host # ./hello.sh
Hello, World
现在我们可以改变配置文件例如,改为包含WHAT=Jim
。我们现在可以运行相同的脚本文件没有任何变化,但现在将打印
user@host # ./hello.sh
Hello, Jim
所以配置文件是一种无需触碰程序本身即可改变程序行为的方法。数据和代码的分离是编程中的一个重要步骤,因为它有助于保持代码整洁并独立于数据。
现在来看一下更复杂的事情:二进制文件。我用一种叫做 的编程语言编写了一个简单的程序C
。它的特别之处在于我们首先编写源代码在文本文件中,然后翻译(我们说编译) 将该文本文件转换为机器可读的 (二进制) 形式。这种二进制形式不再是人类可读的 (至少不容易),但机器可以完美地读取它。
C
源文件hello.c
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *file = fopen( "hello.conf", "r" );
if (file) {
char line[1024];
char what[256];
while (fgets(line, sizeof(line), file)) {
if (sscanf(line, "WHAT=%s", what) == 1) {
printf( "Hello, %s\n", what );
break;
}
}
fclose(file);
}
return 0;
}
正如您已经看到的,这段代码比我们使用的代码要复杂得多,hello.sh
我已经省略了错误处理以简化它。但是,这段代码对操作系统毫无用处。我们首先需要编译(将其翻译)成机器可读的形式。这就是编译器的作用,我将在这里使用gcc
(标准C
编译器)。所以:
user@host # gcc hello.c -o hello
user@host # ls -l
-rwxr-xr-x 1 user user 8536 Jan 6 12:43 hello
-rw-r--r-- 1 user user 423 Jan 6 12:16 hello.c
-rw-r--r-- 1 user user 11 Jan 6 12:18 hello.conf
-rwxr-xr-x 1 user user 60 Jan 6 12:26 hello.sh
编译器生成了二进制文件hello
(没有任何扩展名),我们现在可以执行:
user@host # ./hello
Hello, Jim
现在我们可以再次改变中的定义来hello.conf
改变我们的行为二进制程序,hello
而无需更改源代码并重新编译。我现在可以将hello
没有C
源代码的二进制文件 ( hello.c
) 发送给其他人,他可以连同正确的配置文件一起执行该二进制文件hello.conf
。
二进制文件(如编译的 C 程序)和脚本文件(如 bash 脚本)有各种区别,其中包括:
- 二进制文件(几乎)是不可变的,即用户无法更改他们执行的代码(只能更改他们操作的数据)。它们的行为与编写和编译时的行为相同。
- 二进制文件通常比脚本运行得更快,因为语法检查在编译时已经完成(仅一次)。编译器还会在翻译时优化代码,以便运行得更快。
- 另一方面,每次运行脚本时都会对其进行评估(检查)。这可能需要一些时间。
- 脚本是人类可读的,即用户可以查看脚本并知道它的作用。正如您已经注意到的,这对于二进制文件来说并不容易。如果没有对机器可读代码的深入了解,您就无法知道二进制文件实际上在做什么。您必须相信文档中的内容或程序员告诉您的内容。
最后一项是开源开始:这个想法是二进制文件与源代码一起发送,以便用户可以看到源代码并自己编译程序。闭源另一方面,软件只附带二进制文件。
答案2
我觉得您对配置文件的作用以及程序(通常称为二进制文件)的实际作用有些困惑。
二进制文件或程序是执行某些操作的程序。它们实际上被执行,并且语句被求值。这可能像 2+2 一样简单,或者更复杂,例如ls
,列出当前目录的内容。
配置文件修改什么程序可以。例如,ls
可以配置为显示颜色、列等。程序ls
支持所有这些功能,但可以根据配置激活或停用它们。
对于更复杂的程序,例如apache
作为网络服务器的程序,配置文件可能会极端地改变程序的行为。
程序不是配置文件,配置文件也不是程序。配置文件不执行任何任务,它指示某个程序如何运行。
答案3
这取决于应用程序和软件作者。如果作者希望应用程序为用户提供各种配置参数,他们可以让用户提供更改应用程序行为的命令行参数,或者可以使用配置文件来保存这些信息以备将来使用。许多应用程序(如服务和守护程序)在启动时都需要配置文件,因为配置文件将提供服务执行其任务所需的所有必要信息。使用配置文件来控制硬件(例如为网卡分配起始 IP)比每次都自己做要容易得多,也短得多。
至于ls
,这只是由于历史原因。最初ls
只做了一件事 - 列出目录中的文件,并且创建者并不打算让它有配置文件,尽管它确实有命令行参数。POSIX 标准使其ls
成为类 Unix 操作系统必须支持的基本命令之一,Ubuntu 确实提供了ls
遵守该标准。但是,如果有人想要ls
实现 POSIX 功能并使用配置文件的 make - 他们完全可以做到这一点。