Vinit Bhardwaj Asked: 2019-01-07 01:26:42 +0800 CST2019-01-07 01:26:42 +0800 CST 2019-01-07 01:26:42 +0800 CST 配置文件和二进制文件 772 最后一个答案很好地理解了 linux 中的二进制文件或配置文件。所以问题是为什么我们需要为 ls 命令创建二进制文件或为 linux 系统创建其他二进制配置文件。就像我们制作配置文件来执行特定任务一样,为什么我们没有为 ls 命令和其他二进制文件制作配置文件。 binary 3 个回答 Voted vidarlo 2019-01-07T02:30:03+08:002019-01-07T02:30:03+08:00 我认为您对配置文件的功能以及程序(通常称为二进制文件)的实际功能有些困惑。 二进制文件或程序是做某事的程序。它们实际上被执行,并且语句被评估。这可能像 2+2 一样简单,也可能更复杂,例如ls列出当前目录的内容。 配置文件修改程序的功能。例如ls,可以配置为显示颜色、列等。该程序ls支持所有这些东西,但可以根据配置激活或停用它们。 对于更复杂的程序,例如apacheWeb 服务器,配置文件可能会在很大程度上改变程序的行为。 程序不是配置文件,配置文件也不是程序。配置文件不执行任何任务,它指示一些程序如何表现。 Best Answer PerlDuck 2019-01-07T04:24:10+08:002019-01-07T04:24:10+08:00 我认为您不仅对配置文件和二进制文件感到困惑,而且对配置文件和脚本也感到困惑。让我展示一个非常简单的示例并从配置文件开始: 配置文件hello.conf WHAT=World 这个简单的文本文件只是设置了一个配置变量。它将变量WHAT设置为 value 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的行为,而无需更改源代码并重新编译它。我现在可以将没有源代码 ( ) 的二进制文件发送给其他人,他可以与适当的配置文件一起执行该二进制文件。hellohelloChello.chello.conf 二进制文件(如编译的 C 程序)和脚本文件(如 bash 脚本)有各种不同,其中一些是: 二进制文件(几乎)是不可变的,即用户不能更改他们执行的代码(只能更改他们操作的数据)。它们的行为与编写和编译时一样。 二进制文件通常比脚本运行得更快,因为语法检查并且已经在编译时完成(仅一次)。编译器还将在翻译时优化代码以更快地运行。 另一方面,每次运行脚本时都会评估(检查)脚本。这可能需要时间。 脚本是人类可读的,即用户可以查看脚本并知道它的作用。正如您已经注意到的,这对于二进制文件来说并不容易。如果没有对机器可读代码非常深入的了解,您将无法判断二进制文件的实际作用。你必须相信文档所说的或程序员告诉你的。 最后一项是开源的作用:这个想法是二进制文件与源代码一起提供,因此用户可以查看源代码并自己编译程序。另一方面,闭源软件只是随二进制文件一起提供。 Sergiy Kolodyazhnyy 2019-01-07T02:34:40+08:002019-01-07T02:34:40+08:00 这取决于应用程序和软件的作者。如果作者希望应用程序为用户提供各种配置参数,他们可以让用户提供改变应用程序行为的命令行参数,或者可以有配置文件来保留该信息以备将来使用。许多应用程序(如服务和守护程序)在启动时需要配置文件,因为配置文件将为服务提供执行其任务所需的所有信息。使用配置文件控制硬件,例如为网卡分配状态 IP,比每次都自己做更容易和更短。 至于ls,只是历史原因。Originalls做了一件也是唯一的一件事——列出目录中的文件,而创建者并不打算让它有配置文件,尽管它确实有命令行参数。POSIX 标准是ls类 Unix 操作系统需要支持的基本命令之一,而 Ubuntu 确实提供ls了遵守该标准的规定。但是,如果有人想要ls实现 POSIX 功能并使用配置文件 - 他们可以很好地做到这一点。
我认为您对配置文件的功能以及程序(通常称为二进制文件)的实际功能有些困惑。
二进制文件或程序是做某事的程序。它们实际上被执行,并且语句被评估。这可能像 2+2 一样简单,也可能更复杂,例如
ls
列出当前目录的内容。配置文件修改程序的功能。例如
ls
,可以配置为显示颜色、列等。该程序ls
支持所有这些东西,但可以根据配置激活或停用它们。对于更复杂的程序,例如
apache
Web 服务器,配置文件可能会在很大程度上改变程序的行为。程序不是配置文件,配置文件也不是程序。配置文件不执行任何任务,它指示一些程序如何表现。
我认为您不仅对配置文件和二进制文件感到困惑,而且对配置文件和脚本也感到困惑。让我展示一个非常简单的示例并从配置文件开始:
配置文件
hello.conf
这个简单的文本文件只是设置了一个配置变量。它将变量
WHAT
设置为 valueWorld
。现在考虑一个使用配置文件中定义的值的简单脚本文件。
hello.conf
脚本文件
hello.sh
第一行告诉操作系统如何处理这个文件。在这种情况下,它将由
/bin/bash
程序运行。bash
知道我们在这个脚本中使用的语法并采取相应的行动。也就是说:它获取(=读取)我们的配置文件hello.conf
,然后能够使用我们在该文件中所做的所有定义。接下来,它会回显字符串,Hello,
后跟$WHAT
配置文件中变量的内容。如果我们运行该脚本,我们会得到:现在我们可以将配置文件更改为包含,例如
WHAT=Jim
。我们现在可以运行相同的脚本文件而不做任何更改,但它现在将打印因此,配置文件是一种无需接触程序本身即可更改程序行为的方法。数据和代码的这种分离是编程中的一个重要步骤,因为它有助于保持代码干净且独立于数据。
现在来点更复杂的:二进制文件. 我用一种叫做
C
. 它的特殊之处在于我们首先将源代码写入文本文件,然后将该文本文件翻译(我们说编译)成机器可读(二进制)形式。这种二进制形式不再是人类可读的(嗯,至少不容易),但机器可以完美地读取它。C
源文件hello.c
正如您已经看到的,这比我们使用的代码要复杂得多,
hello.sh
并且我已经省略了错误处理以简化它。但是,此代码对操作系统没有用。我们首先需要将其编译(翻译)成机器可读的形式。这就是编译器的用途,我将在这里使用gcc
(标准C
编译器)。所以:编译器生成了二进制文件
hello
(没有任何扩展名),我们现在可以执行它:现在我们可以再次更改 中的定义以更改二进制程序
hello.conf
的行为,而无需更改源代码并重新编译它。我现在可以将没有源代码 ( ) 的二进制文件发送给其他人,他可以与适当的配置文件一起执行该二进制文件。hello
hello
C
hello.c
hello.conf
二进制文件(如编译的 C 程序)和脚本文件(如 bash 脚本)有各种不同,其中一些是:
最后一项是开源的作用:这个想法是二进制文件与源代码一起提供,因此用户可以查看源代码并自己编译程序。另一方面,闭源软件只是随二进制文件一起提供。
这取决于应用程序和软件的作者。如果作者希望应用程序为用户提供各种配置参数,他们可以让用户提供改变应用程序行为的命令行参数,或者可以有配置文件来保留该信息以备将来使用。许多应用程序(如服务和守护程序)在启动时需要配置文件,因为配置文件将为服务提供执行其任务所需的所有信息。使用配置文件控制硬件,例如为网卡分配状态 IP,比每次都自己做更容易和更短。
至于
ls
,只是历史原因。Originalls
做了一件也是唯一的一件事——列出目录中的文件,而创建者并不打算让它有配置文件,尽管它确实有命令行参数。POSIX 标准是ls
类 Unix 操作系统需要支持的基本命令之一,而 Ubuntu 确实提供ls
了遵守该标准的规定。但是,如果有人想要ls
实现 POSIX 功能并使用配置文件 - 他们可以很好地做到这一点。