Shell脚本的用户配置。最佳做法?


13

我正在编写带有一些应由用户配置的变量的shell脚本。可能会出现一系列问题,将提供一个用于下载和配置脚本的安装程序。该脚本针对其他开发人员。

这可以通过多种方式实现:

  1. 在脚本本身中使用占位符,并sed在安装过程中用于替换占位符(如下所示:https : //stackoverflow.com/questions/415677/how-to-replace-placeholders-in-a-text-file

    • 优点:所有变量定义都包含在脚本中。手动下载脚本并为喜欢编辑器而不是安装程序的用户配置变量很容易。

    • 缺点:一旦安装到位,就很难通过安装程序重新配置变量。除非我创建一个更复杂的正则表达式,否则容易出错。

  2. 使用配置文件(基本上是另一个带有分配的shell脚本),并使用source它来包含它。(并且可能将其放置在~/.scriptname?主脚本已复制到中/usr/local/bin

    • 优点:重新配置脚本很容易。甚至可以从主脚本中添加用于这样做的参数(可能也可以在第一个解决方案中使用,但是从本身编辑脚本听起来不是一个好主意)

    • 缺点:该脚本现在依赖于两个文件,并且要求用户运行安装程序才能创建配置文件。如果不存在,可以通过自动生成配置文件来解决。但是,对于只想下载脚本,进行编辑并完成脚本的用户而言,查找外部配置文件仍然比较麻烦。

另外,关于安装后用户应如何管理配置的一些选项:


  1. $ myscript config server.host example.org 这样的Git $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web

  2. Interactive
    $ myscript config
    输入服务器主机名:example.org
    输入服务器上代理
    的路径:/ home / johndoe / proxy 输入服务器上http目录的路径:/ home / johndoe / web

  3. 带有长选项的getopts
    $ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web

  4. 简单的
    $ myscript配置example.org / home / johndoe / proxy / home / johndoe / web

您还有其他方法可以考虑吗?
有什么最佳做法,有什么优雅的做法?


2
我毫不怀疑您可以编写可完成所有这些操作的Shell脚本,但问题是为什么您要编写如此复杂的内容,因为它需要在Shell脚本中安装程序。无论如何,请查看Linux内核配置系统如何管理其配置文件。

好。“安装程序”脚本只会下载真实脚本,将其复制到正确的位置,并询问一系列配置问题(3-4个变量)。这样,我可以给用户一个命令行,即获取安装脚本并将其通过管道传递到/ bin / sh。当然,我可以跳过安装程序,而只需在主脚本中添加一个“安装”参数。也许是更好的解决方案,您怎么看?
查理·鲁登斯塔尔(CharlieRudenstål)2012年

“但是问题是为什么要写这么复杂的东西”,这是有问题的脚本:github.com/charlie-rudenstal/depo我正在尝试减少新用户需要执行的步骤数量,尤其是在安装。同时考虑使所需的服务器设置也自动进行。
CharlieRudenstål2012年

Answers:


6

我会从一个合理的程序(无论是否使用Shell脚本)中期望什么:

  • 从来不需要更改可执行文件以仅对其进行配置。这不是操作系统内核。
  • 我可以使用命令行传递任何设置。对于没有合理默认值的每条信息,这都是必须的。唯一的例外是需要交互输入的密码。
  • (可选)我可以使用环境变量传递设置。
  • 我可以将设置写到一个配置文件中,如果该文件以众所周知的名称存在,或者使用上述两种方法明确指向,则将使用该文件。
  • 配置文件使用与命令行相同的设置名称和语法。

很好的建议。这是您偏爱的订单吗?(1)在命令行中检查传递的设置(2)检查同一目录中.scriptnameConfig中的设置(3)检查环境变量中的设置(4)在〜/ .scriptnameConfig中检查.scriptnameConfig中的设置(5)使用默认值设置
查理·鲁登斯塔尔(CharlieRudenstål)2012年

“配置文件使用与命令行相同的设置名称和语法。” -应该看起来如何?我打算将赋值语法用于常规Shell脚本:SETTING = VALUE。在配置文件中,像语法这样的命令不会感到有些奇怪吗?
查理·鲁登斯塔尔(CharlieRudenstål)2012年

查看如何mountssh允许您在命令行和config中使用相同的语法。您无需完全复制命令行语法。可以使用“ foo = bar”代替“ --foo = bar”。如果您使用的是'BarOption:Foo',它将不那么方便:需要记住大小写是否重要,文件中接受哪个关键字以及在命令行中接受哪个关键字,以及无法复制粘贴工作命令仅需进行外观编辑即可将其插入配置文件。
9000

3

当我需要使用各种配置选项编写精美的脚本时,可以将Python与argparseConfigParser库一起使用。这些对实现有帮助,但是该过程适用于任何shell脚本:

  1. 查找配置文件。如果存在,则将其具有的所有设置读入字典/查找表。
  2. 解析命名的命令行参数。对于提供的每个参数,请覆盖从配置文件加载的值(如果存在)。对于未在命令行中且未在配置中传递的任何参数,请使用默认值。
  3. 执行脚本的主要功能
  4. 如果配置文件不存在,则将传递的和/或默认值写入配置文件。

我的首选是当脚本将被重复使用时,配置文件保留首选选项,但让任何命令行参数都覆盖。首次运行时,使用这些参数编写配置文件。然后可以共享配置文件并将其提交到代码存储库。

在我最近的情况下,我还将默认值写到[DEFAULT]配置文件顶部的部分,然后为每个“环境”都有一个部分,并为每个部分都设置了适当的替代。“环境”是脚本的第一个未命名参数。因此,在这种情况下,将参数选择为内置默认值 -> 配置文件默认值 -> 配置文件节值 -> 命令行参数。附加的命令行参数提供了使用最新运行值覆盖现有配置的选项。该配置文件被写入当前目录,因此它适用于每个项目,并且可以与其余代码一起提交。其他签出同一项目的人将以相同的配置开始。


“附加的命令行参数提供了使用最新运行值覆盖现有配置的选项。” 这是一个有趣的方法。将参数与配置结合起来的便捷方法。
CharlieRudenstål2012年

+1,我也建议您default.config在与脚本位于同一目录中的文件中设置默认值,然后在以下位置查找配置文件~/.scriptname以覆盖这些值。这样,每个值都有一个有效的默认值,并且更易于维护。
亚伦

2

编辑占位符容易出错。

我会使用配置文件。

您对依赖的担心是有效的,但是,我不记得使用太多由单个文件组成的工具。因此,理论上您是正确的,但实际上应该没问题。

一个第三个选项是使配置软件一个新的定制版本特定于所选择的选项和参数。当然,这可能很难编写和测试:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.