2

假设我们有一些在 Linux 计算机上运行的脚本“m12”(我刚刚发明了这个名称)。如果它位于您的 $PATH 中,您可以像这样从控制台轻松运行它:

m12 

它将使用默认参数。但是你可以通过运行它来自定义这个脚本的工作:

m12 --enable_feature --select=3

这很棒,而且会奏效。但是我想创建一个配置文件~/.m12rc,所以我不需要--enable_feature --select=3每次运行它时都指定。它可以很容易地完成。

困难的部分从这里开始。

所以,我有~/.m12rc配置文件,但是我要在m12没有存储在该配置文件中的参数的情况下开始。Unix 的方法是什么?我应该像这样运行脚本:

m12 --ignore_config

还是有更好的解决方案?

下一个。假设我有一个配置文件~/.m12rc,我想从该文件中获取一些参数,但想稍微改变一下。我应该如何运行脚本以及脚本应该如何工作?

最后一个问题。.m12rc 脚本首先在当前目录中查找,然后在中~/查找,这是一个好主意/etc吗?

我问所有这些问题是因为我要在我的 小脚本中实现配置文件,并且我想对设计做出正确的决定。

4

2 回答 2

4

ES Raymond的“The Art of Unix Programming”一书讨论了这些问题

您可以使用--config-file=/dev/null.

您通常会使用以下命令:

  • 系统范围的配置(/etc/m12/m12rc或只是/etc/m12)。
  • 用户个人配置 ( ~/.m12rc)
  • 本地目录配置 ( ./.m12rc)
  • 命令行选项

每个后面列出的项目都会覆盖前面列出的项目。您应该能够在命令行上指定要读取的配置文件;可以说,这应该优先于其他选项。想想--no-system-config--no-user-config--no-local-config。许多脚本不保证系统配置文件。我开发的大多数脚本不会同时使用本地配置和用户配置。但这就是我的思维方式。

我打包标准选项的方式是在$HOME/bin(比如说m12a)中有一个脚本为我做这件事:

#!/bin/sh
exec m12 --enable_feature --select=3 "$@"

如果我想要这些选项,我会运行m12a. 如果我想要一些其他选项,我会m12使用必要的选项运行 raw。我的个人 bin 目录中有数百个文件(在我的主机 Mac 上大约有 500 个;其中一些是可执行文件,但很多是脚本)。

于 2012-07-11T16:40:13.673 回答
0

让我分享一下我的经验。我通常在脚本开头提供配置文件。在配置文件中,我还处理所有参数开关:

   DEFAULT_USER=blabla
   while getopts ":u" do
      case $opt in
      u) 
        export APP_USER=$OPTARG
       ;;
      esac
   done
   export APP_USER=${APP_USER-$DEFAULT_USER}

然后在脚本中我只使用变量,这让我有多个具有相同输入参数的脚本。

在您的情况下,我成像您会将“getopts”部分移动到脚本中,并在它获取配置文件之后(如果没有切换到跳过采购)。

你不应该把你的脚本配置文件放到 etc 中,它需要 root 权限才能做到这一点,你可以简单地在家中使用配置文件。如果你想把你的脚本与其他用户共享,它应该去 /usr/share...

另一种解决方案使用 thor(ruby gem),它处理输入参数的方式更简单,避免在 bash 中获得相同结果的工作,例如 getopts 仅支持单字母开关。

于 2012-07-11T16:10:25.193 回答