mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-13 22:30:37 +08:00
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:
commit
e642c7239b
@ -3,25 +3,26 @@
|
|||||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||||
[#]: collector: (lujun9972)
|
[#]: collector: (lujun9972)
|
||||||
[#]: translator: (unigeorge)
|
[#]: translator: (unigeorge)
|
||||||
[#]: reviewer: ( )
|
[#]: reviewer: (wxy)
|
||||||
[#]: publisher: ( )
|
[#]: publisher: (wxy)
|
||||||
[#]: url: ( )
|
[#]: 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` 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式?
|
计算机上有数以千计的配置文件。你可能永远不会直接与其中的大部分文件打交道,但它们确实散落在你的 `/etc` 以及 `~/.config`、`~/.local`、`/usr` 文件夹中。还有一些可能在 `/var`,甚至 `/opt` 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式?
|
||||||
|
|
||||||
存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码如何将数据存入文件,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。
|
存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码是如何将数据存入文件的,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。
|
||||||
|
|
||||||
### 为什么我们需要配置文件
|
### 为什么我们需要配置文件
|
||||||
|
|
||||||
配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。
|
配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。
|
||||||
|
|
||||||
配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名称,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:
|
配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名字,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:
|
||||||
|
|
||||||
```
|
```
|
||||||
Tux
|
Tux
|
||||||
@ -34,7 +35,7 @@ NAME='Tux'
|
|||||||
SPECIES='Penguin'
|
SPECIES='Penguin'
|
||||||
```
|
```
|
||||||
|
|
||||||
即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 [`awk` 命令][2],另一个使用 [grep 命令][3]。两个例子都是只关注包含 `NAME`“键”的行,并返回出现在等号 (`=`) 之后的“值”:
|
即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 [awk 命令][2],另一个使用 [grep 命令][3]。两个例子都是只关注包含 `NAME` “键”的行,并返回出现在等号 (`=`) 之后的“值”:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini
|
$ 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`)就好。这些键值对很容易解析和编辑。
|
这种简单的配置风格很直观,只要你别选择使用糟糕的键名(比如用 `unampref` 这样的神秘键名来代替 `name`)就好。这些键值对很容易解析和编辑。
|
||||||
|
|
||||||
除了键和值之外,INI 格式还可以分 <ruby>节<rt>section</rt></ruby>。在下列示例代码中,`[example]` 和 `[demo]` 就是配置文件中的两节:
|
除了键和值之外,INI 格式还可以分 <ruby>节<rt>section</rt></ruby>。在下列示例代码中,`[example]` 和 `[demo]` 就是配置文件中的两个节:
|
||||||
|
|
||||||
```
|
```
|
||||||
[example]
|
[example]
|
||||||
@ -77,14 +78,14 @@ name=Beastie
|
|||||||
fullscreen=1
|
fullscreen=1
|
||||||
```
|
```
|
||||||
|
|
||||||
这几个配置语句解析起来有点复杂,因为有 _两个_ `name` 键。想象一下,一个粗心的程序员在这个配置文件中查询 `name`,结果总是返回 `Beastie`,因为这是文件中对 name 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。
|
这几个配置语句解析起来有点复杂,因为有两个 `name` 键。想象一下,一个粗心的程序员在这个配置文件中查询 `name`,结果总是返回 `Beastie`,因为这是文件中对 `name` 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。
|
||||||
|
|
||||||
#### YAML
|
#### YAML
|
||||||
|
|
||||||
[YAML 文件][4] 是结构化列表,可以包含值或者键值对:
|
[YAML 文件][4] 是结构化列表,可以包含值或者键值对:
|
||||||
|
|
||||||
```
|
```
|
||||||
\---
|
---
|
||||||
Example:
|
Example:
|
||||||
Name: 'Tux'
|
Name: 'Tux'
|
||||||
Style:
|
Style:
|
||||||
@ -93,13 +94,13 @@ Example:
|
|||||||
Enabled: 1
|
Enabled: 1
|
||||||
```
|
```
|
||||||
|
|
||||||
YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的特色,在其他人眼中可能就是一个 bug。许多开发人员不愿使用 YAML,正是因为它很看重本质上 _不存在_ 的东西。如果你在 YAML 中缩进错误,YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。
|
YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的这种特色,在其他人眼中可能就是一个问题。许多开发人员不愿使用 YAML,正是因为它很看重本质上 _不存在_ 的东西。如果你在 YAML 中缩进错误,YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。
|
||||||
|
|
||||||
大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters(验证语法的应用程序)来帮你确保 YAML 文件的完整性。
|
大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters(验证语法的应用程序)来帮你确保 YAML 文件的完整性。
|
||||||
|
|
||||||
#### JSON
|
#### 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
|
#### XML
|
||||||
|
|
||||||
@ -158,7 +159,7 @@ via: https://opensource.com/article/21/6/what-config-files
|
|||||||
作者:[Seth Kenlon][a]
|
作者:[Seth Kenlon][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[unigeorge](https://github.com/unigeorge)
|
译者:[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/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
Loading…
Reference in New Issue
Block a user