Merge pull request #23393 from wxy/20210622-What-is-a-config-file

PRF&PUB:published/20210622 What is a config file.md
This commit is contained in:
Xingyu.Wang 2021-09-29 13:54:55 +08:00 committed by GitHub
commit e642c7239b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,25 +3,26 @@
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
[#]: collector: (lujun9972)
[#]: translator: (unigeorge)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-13832-1.html)
什么是配置文件?
浅谈配置文件格式
======
流行的配置文件格式有若干种,每种都有其独特优势。从中找到最适合你的格式吧!
![Computer screen with files or windows open][1]
> 流行的配置文件格式有若干种,每种都有其自身优势。从中找到最适合你的格式吧!
![](https://img.linux.net.cn/data/attachment/album/202109/29/134955py5ypl58dgplyx4x.jpg)
计算机上有数以千计的配置文件。你可能永远不会直接与其中的大部分文件打交道,但它们确实散落在你的 `/etc` 以及 `~/.config`、`~/.local`、`/usr` 文件夹中。还有一些可能在 `/var`,甚至 `/opt` 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式?
存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码如何将数据存入文件,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。
存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码如何将数据存入文件,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。
### 为什么我们需要配置文件
配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。
配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:
配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:
```
Tux
@ -34,7 +35,7 @@ NAME='Tux'
SPECIES='Penguin'
```
即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 [`awk` 命令][2],另一个使用 [grep 命令][3]。两个例子都是只关注包含 `NAME`“键”的行,并返回出现在等号 (`=`) 之后的“值”:
即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 [awk 命令][2],另一个使用 [grep 命令][3]。两个例子都是只关注包含 `NAME` “键”的行,并返回出现在等号 (`=`) 之后的“值”:
```
$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini
@ -47,7 +48,7 @@ $ grep NAME fake.txt | cut -d'=' -f2
### 选择格式
为了保证普遍有效性,配置文件最重要的一点是它们是一致的和可预测的。你绝对不会想做这样的事:以保存用户首选项的名义,将信息随意存储到文件中,然后就得花好几天时间来编写代码,以对整个文件中的随机信息实现读取操作
为了保证普遍有效性,配置文件最重要的一点是它们是一致的和可预测的。你绝对不会想做这样的事:以保存用户首选项的名义,将信息随意存储到文件中,然后花好几天时间逆向工程,来找到最终出现在文件中的随机信息
流行的配置文件格式有若干种,每种格式都有自己的优势。
@ -64,7 +65,7 @@ enabled=1
这种简单的配置风格很直观,只要你别选择使用糟糕的键名(比如用 `unampref` 这样的神秘键名来代替 `name`)就好。这些键值对很容易解析和编辑。
除了键和值之外INI 格式还可以分 <ruby><rt>section</rt></ruby>。在下列示例代码中,`[example]` 和 `[demo]` 就是配置文件中的两节:
除了键和值之外INI 格式还可以分 <ruby><rt>section</rt></ruby>。在下列示例代码中,`[example]` 和 `[demo]` 就是配置文件中的两节:
```
[example]
@ -77,14 +78,14 @@ name=Beastie
fullscreen=1
```
这几个配置语句解析起来有点复杂,因为有 _两个_ `name` 键。想象一下,一个粗心的程序员在这个配置文件中查询 `name`,结果总是返回 `Beastie`,因为这是文件中对 name 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。
这几个配置语句解析起来有点复杂,因为有两个 `name` 键。想象一下,一个粗心的程序员在这个配置文件中查询 `name`,结果总是返回 `Beastie`,因为这是文件中对 `name` 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。
#### YAML
[YAML 文件][4] 是结构化列表,可以包含值或者键值对:
```
\---
---
Example:
  Name: 'Tux'
  Style:
@ -93,13 +94,13 @@ Example:
  Enabled: 1
```
YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的特色,在其他人眼中可能就是一个 bug。许多开发人员不愿使用 YAML正是因为它很看重本质上 _不存在_ 的东西。如果你在 YAML 中缩进错误YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。
YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的这种特色,在其他人眼中可能就是一个问题。许多开发人员不愿使用 YAML正是因为它很看重本质上 _不存在_ 的东西。如果你在 YAML 中缩进错误YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。
大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters验证语法的应用程序来帮你确保 YAML 文件的完整性。
#### JSON
JSON 文件在技术上来说是 YAML 的子,因此其数据结构是相同的,尽管其语法完全不同:
JSON 文件在技术上来说是 YAML 的子,因此其数据结构是相同的,尽管其语法完全不同:
```
{
@ -116,7 +117,7 @@ JSON 文件在技术上来说是 YAML 的子类,因此其数据结构是相同
}
```
JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 全称为 JavaScript Object Notation 即 JavaScript 对象符号。由于与 Web 开发密切相关JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。
JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 全称为<ruby>JavaScript 对象符号<rt>JavaScript Object Notation</rt></ruby>。由于与 Web 开发密切相关JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。
#### XML
@ -158,7 +159,7 @@ via: https://opensource.com/article/21/6/what-config-files
作者:[Seth Kenlon][a]
选题:[lujun9972][b]
译者:[unigeorge](https://github.com/unigeorge)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出