当我将一个变量定义从脚本文件移动到另一个,以及其他几行代码时,我正在维护一些我们在开发服务器上用于自动构建的shell脚本。结果,这一行:
WEB=/home/server/web
从该脚本文件移动到另一个脚本文件,并且不再在第一个脚本文件使用的环境中。因此,稍后在文件中,
rm -rf $WEB/*
被评估为Linux用户的可怕命令:rm -rf /*
我的问题是,您是否会考虑以这种方式使用环境变量的不良做法或认为有害?像经典
之类的东西if (foo)
bar()
bar2()
删除变量声明的含义不是很明显,并且可能令人惊讶吗?或者在搬这样的东西时我应该更加小心吗?
答案 0 :(得分:2)
我不能说这是“糟糕的做法”,但我会说,无论何时你在剧本中使用rm -rf它都会带来危险;)
通常我要做的是创建一个名为/ tmp / todelete的目录,它们是我在脚本中删除的所有数据,然后每隔几个小时通过一个cron作业擦除该目录。这样一来,如果事情变得混乱,我有时间在数据真正被删除之前抓住它。
答案 1 :(得分:0)
我认为作业实际上是(不是$
):
WEB=/home/server/web
如果是在脚本中写的,那么它不是环境变量;以适当的方式使用它是完全合法的,包括rm -fr $WEB/*
。
如果作业不在脚本中,或者只在脚本中默认,那么它更危险,但使用它仍然是合法的:
: ${WEB:=/home/server/web}
rm -fr $WEB/*
这意味着'如果环境变量$WEB
设置为非空值,请使用它;否则使用值/home/server/web
'。 $WEB
的此值应进行完整性检查,尤其是root
将运行脚本时。请注意,值$WEB
的尾随空白可能会造成意想不到的破坏。
然而,它成了一个判断电话。我可能不会这样做;用于删除内容的环境变量太容易被意外或故意滥用。我可能需要将作为参数传递给脚本的值。但是使用环境变量并没有正式错误;这有点危险。如果你有很好的备份,那就没那么危险了,但要注意环境中的WEB=/
!
答案 2 :(得分:0)
检查变量是否设置了值(防御性编程)
可能是个好主意例如
#!/bin/bash
#WEB=
WEB=/home/server/web
if [ -z "${WEB+X}" ]
then
echo "\$WEB is unset"
elif [ -z "$WEB" ]
then
echo "\$WEB is set but empty"
else
echo "The value of \$WEB is $WEB"
rm -rf $WEB/*
fi
答案 3 :(得分:0)
一般情况下使用环境变量有点危险,但正如您所发现的那样,它们在某些地方可能非常危险。另一个危险源是,如果忘记设置/检查变量,可以通过其他程序在shell中任意设置变量。
但是你确实需要环境变量来使用像bash这样的shell来做事。如果你可以在"危险"地点(rm
,chmod
,chown
,...),那就更好了。总的来说,我认为最好的方法是在移动事物并使用rm
等命令时要更加谨慎。