如何解析Bash程序的配置文件

272 阅读4分钟

将程序配置与代码分开是很重要的。它使非程序员能够改变配置而不需要修改程序的代码。如果是编译的二进制可执行文件,这对非程序员来说是不可能的,因为它不仅需要访问源文件(我们在开放源码程序中确实有),而且还需要程序员的技能组合。很少有人有这种能力,而且大多数人都不想学习。

对于像Bash这样的shell语言,由于shell脚本没有被编译成二进制格式,所以根据定义,源代码是可以访问的。尽管有这样的开放性,但对于非程序员来说,在shell脚本中钻研和修改它们并不是一个特别好的主意。即使是知识渊博的开发人员和系统管理员,也可能意外地做出一些改变,导致错误或更糟的情况。

因此,将配置项放在容易维护的文本文件中,提供了分离,并允许非程序员编辑配置元素,而没有对代码进行意外修改的危险。许多开发者对用编译语言编写的程序都是这样做的,因为他们并不期望用户是开发者。出于许多同样的原因,对解释型外壳语言这样做也是有意义的。

通常的方法

和其他许多语言一样,你可以为Bash程序编写代码,读取并解析ASCII文本的配置文件,读取变量名称,并在程序代码执行时设置值。例如,一个配置文件可能看起来像这样。

var1=LinuxGeek46
var2=Opensource.com

该程序将读取该文件,解析每一行,并将值设置到每个变量中。

寻源

Bash使用了一种更简单的方法来解析和设置变量,叫做源码。从一个可执行的shell程序中获取一个外部文件是一种简单的方法,可以将该文件的内容完整地纳入shell程序中。在某种意义上,这很像编译语言include ,在运行时包括库文件。这样的文件可以包括任何类型的Bash代码,包括变量赋值。

像往常一样,演示比解释更容易。

首先,创建一个~/bin 目录(如果它还不存在的话),并将其作为当前工作目录(PWD)。Linux文件系统分层标准~/bin 定义为用户存储可执行文件的适当位置。

在这个目录下创建一个新文件。将其命名为main ,并使其成为可执行文件。

[dboth@david bin]$ touch main
[dboth@david bin]$ chmod +x main
[dboth@david bin]$

在这个可执行文件中添加以下内容。

#!/bin/bash
Name="LinuxGeek"
echo $Name

并执行这个Bash程序。

[dboth@david bin]$ ./main
LinuxGeek
[dboth@david bin]$

创建一个新的文件并将其命名为~/bin/data 。这个文件不需要是可执行的。在其中添加以下信息。

# Sourced code and variables
echo "This is the sourced code from the data file."
FirstName="David"
LastName="Both"

main 程序中增加三行,使其看起来像这样。

#!/bin/bash
Name="LinuxGeek"
echo $Name
source ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

重新运行该程序。

[dboth@david bin]$ ./main
LinuxGeek
This is the sourced code from the data file.
First name: David
LastName: Both
[dboth@david bin]$

关于源码还有一件非常酷的事情要知道。你可以使用单点(.)作为source 命令的快捷方式。改变main 文件,用. 来代替source

#!/bin/bash
Name="LinuxGeek"
echo $Name
. ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

然后再次运行该程序。结果应该与之前的运行完全相同。

启动Bash

每一台使用Bash的Linux主机--这几乎是所有的主机,因为Bash是所有发行版的默认shell--都包括一些优秀的、内置的sourcing的例子。

每当Bash shell启动时,它的环境必须被配置成可以使用的样子。有五个主要文件和一个目录用于配置Bash环境。这里列出了它们的主要功能。

  • /etc/profile:全系统环境和启动程序
  • /etc/bashrc:全系统的功能和别名
  • /etc/profile.d/:包含全系统脚本的目录,用于配置各种命令行工具,如vimmc 以及系统管理员创建的任何自定义配置脚本。
  • ~/.bash_profile:用户特定的环境和启动程序
  • ~/.bashrc:用户特定的别名和功能
  • ~/.bash_logout:当用户注销时执行的特定用户命令

试着通过这些文件追踪执行顺序,并确定它在非登录Bash初始化与登录Bash初始化中使用的顺序。我在我的Linux培训系列第一卷的第17章中做了这个。 使用和管理Linux。从零到系统管理员.

我给你一个提示。这一切都从~/.bashrc 脚本开始。

总结

这篇文章探讨了将代码和变量分配拉到Bash程序中的源码。这种从配置文件中解析变量的方法是快速、简单和灵活的。它提供了一种将Bash代码与变量赋值分开的方法,以使非程序员能够设置这些变量的值。