在rm -rf语句中使用环境变量是不好的做法吗?

时间:2011-04-19 01:10:44

标签: linux shell

当我将一个变量定义从脚本文件移动到另一个,以及其他几行代码时,我正在维护一些我们在开发服务器上用于自动构建的shell脚本。结果,这一行:

WEB=/home/server/web

从该脚本文件移动到另一个脚本文件,并且不再在第一个脚本文件使用的环境中。因此,稍后在文件中,

rm -rf $WEB/*

被评估为Linux用户的可怕命令:rm -rf /*

我的问题是,您是否会考虑以这种方式使用环境变量的不良做法或认为有害?像经典

之类的东西
if (foo)
    bar()
    bar2()

删除变量声明的含义不是很明显,并且可能令人惊讶吗?或者在搬这样的东西时我应该更加小心吗?

4 个答案:

答案 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来做事。如果你可以在"危险"地点(rmchmodchown,...),那就更好了。总的来说,我认为最好的方法是在移动事物并使用rm等命令时要更加谨慎。