我一般同意之前的答案,但还有另一个重要方面:可用性。
例如,git
您可以在其中创建一个带有.git目录的存储库。要指定它,您可以使用命令行参数--git-dir
或环境变量GIT_DIR
。
当然,如果您将当前目录更改为另一个存储库或在脚本中继承环境变量,则会出错。但是,如果您需要git
在一个终端会话中在分离的存储库中键入多个命令,这非常方便:您不需要重复git-dir
参数。
另一个例子是GIT_AUTHOR_NAME
。似乎它甚至没有命令行伙伴(但是,git commit
有一个--author
参数)。GIT_AUTHOR_NAME
覆盖user.name和author.name配置设置。
一般来说,命令行或环境参数的使用在 UNIX 上同样简单:可以使用命令行参数
$ command --arg=myarg
或一行中的环境变量:
$ ARG=myarg command
捕获命令行参数也很容易alias
:
alias cfg='git --git-dir=$HOME/.cfg/ --work-tree=$HOME' # for dotfiles
alias grep='grep --color=auto'
通常,大多数参数都是通过命令行传递的。我同意之前的答案,即这更实用、更直接,并且脚本中的环境变量就像程序中的全局变量。
GNU libc是这样说的:
argv机制通常用于传递特定于正在调用的特定程序的命令行参数。另一方面,环境跟踪由许多程序共享、不经常更改且不经常使用的信息。
除了所说的环境变量的危险之外,它们还有很好的用例。GNU make对环境变量的处理非常灵活(因此与 shell 非常集成):
make在启动时看到的每个环境变量都会转换为具有相同名称和值的make变量。但是,makefile 中的显式分配或使用命令参数会覆盖环境。(- 并且有一个选项可以改变这种行为)......
因此,通过在您的环境中设置变量 CFLAGS,您可以使大多数 makefile 中的所有 C 编译都使用您喜欢的编译器开关。这对于具有标准或常规含义的变量是安全的,因为您知道没有任何 makefile 会将它们用于其他用途。
最后,我要强调的是,对于一个程序来说,最重要的不是程序员,而是用户体验。也许您将其包含在设计方面,但内部和外部设计是完全不同的实体。
以及关于编程方面的几句话。您没有编写您使用的语言,但让我们想象一下您的工具允许您进行最佳的参数解析。在 Python 中,我使用argparse,它非常灵活和丰富。要获取解析的参数,可以使用类似的命令
args = parser.parse_args()
args可以进一步拆分为已解析的参数(例如args.my_option),但我也可以将它们作为一个整体传递给我的函数。这个解决方案绝对不是“难以维护大量参数”(如果您的语言允许的话)。实际上,如果您有许多参数并且在参数解析期间未使用它们,请将它们在容器中传递到它们的最终目的地并避免代码重复(这会导致不灵活)。
最后的评论是解析环境变量比命令行参数容易得多。环境变量只是一对,VARIABLE=value
. 命令行参数可能要复杂得多:它们可以是位置参数或关键字参数,或子命令(如git push
)。它们可以捕获零个或多个值(回想一下命令echo
和标志,如-vvv
)。有关更多示例,请参见argparse。
还有一件事情。你对记忆的担心有点令人不安。不要编写过于笼统的程序。一个库应该是灵活的,但是一个好的程序在没有任何参数的情况下是有用的。如果你需要传递很多,这可能是data,而不是arguments。如何将数据读入程序是一个更普遍的问题,没有适用于所有情况的单一解决方案。