使用环境变量传递参数的缺点

时间:2016-08-17 20:10:25

标签: bash command-line environment-variables

以下替代方法用于将参数传递给Bash shell下的可执行文件。我相信第一种方法目前比较常见。

方法1 - 将变量作为命令行参数传递

./myprogram --arg1 1

方法2 - 根据每个调用环境变量传递参数

arg1=1 ./myprogram

使用第二种方法时可能会出现什么问题?

这个密切相关的问题(Argument passing strategy - environment variables vs. command line)正在解决更广泛的环境变量使用问题,而不是我感兴趣的直接每次调用。

1 个答案:

答案 0 :(得分:3)

第一种方法更常见,以便其他人更容易理解。

在大多数情况下,使用了环境变量($ ORACLE_HOME,$ JAVA,..),它不是在命令行中设置的,而是在不久之前设置并由不同脚本使用。因此,当您认为var应该是配置的一部分时,使用环境变量(作为默认值)就可以了 在其他情况下,我会使用参数。

如何修改脚本:

# First script calling myprogram that uses ...
# Difficult to see, the vars name and lastname
name="John"
while read -r lastname; do
   ./myprogram 
done  < lastnames.txt

现在有人想要更改循环并从数据库中获取具有环境变量username的所有用户。

name="John"
while read -r lastname; do
   ./myprogram 
   username="${lastname}" ~/bin/getdbusers
done  < lastnames.txt

这次你很幸运,第二个人也使用var username并且不知道./myprogram使用lastname的事实。他很想通过改变循环变量来引入一个bug:

name="John"
while read -r username; do
   ./myprogram # Oops, this should have been changed into lastname=username ./myprogam
   ~/bin/getdbusers
   ~/bin/somethingWithUserName
done  < lastnames.txt

越来越难以理解哪些程序使用$ name和其他vars 使用参数可以更容易理解,并且可以防止错误:

name="John"
while read -r lastname; do
   ./myprogram "${name}" "${lastname}"
   ~/bin/getdbusers "${lastname}"
   ~/bin/somethingWithUserName "${lastname}"
done  < lastnames.txt