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

Linux 在rm-rf语句中使用环境变量是一种不好的做法吗?,linux,shell,Linux,Shell,我在维护一些shell脚本,这些脚本用于开发服务器上的自动构建,当时我将一个变量定义从一个脚本文件移动到另一个脚本文件,以及其他几行代码。因此,这一行: WEB=/home/server/web 已从该脚本文件移动到另一个脚本文件,并且不再位于第一个脚本文件使用的环境中。因此,在文件的后面部分 rm -rf $WEB/* 已根据Linux用户可怕的命令进行评估:rm-rf/* 我的问题是,你会考虑使用环境变量这样的坏做法或被认为是有害的吗?有点像经典 if (foo) bar()

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

WEB=/home/server/web
已从该脚本文件移动到另一个脚本文件,并且不再位于第一个脚本文件使用的环境中。因此,在文件的后面部分

rm -rf $WEB/*
已根据Linux用户可怕的命令进行评估:
rm-rf/*

我的问题是,你会考虑使用环境变量这样的坏做法或被认为是有害的吗?有点像经典

if (foo)
    bar()
    bar2()

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

我假设作业实际上是(没有
$
):

如果这是写在脚本中的,那么它不是一个环境变量;以任何适当的方式使用它是完全合法的,包括在
rm-fr$WEB/*

如果分配不在脚本中,或仅在脚本中默认,则更危险,但使用它仍然是合法的:

: ${WEB:=/home/server/web}

rm -fr $WEB/*
这意味着“如果环境变量
$WEB
设置为非空值,请使用它;否则使用值
/home/server/web
”。应检查
$WEB
的此值是否正常,尤其是如果
root
将运行脚本。请注意,
$WEB
值中的尾随空格可能会造成意外的破坏

然而,这变成了一种判断。我可能不会这么做;用于移除物品的环境变量太容易受到意外或故意滥用的影响。我可能需要将该值作为参数传递给脚本。但使用环境变量在形式上并不是错误的;只是有点危险。如果你有很好的备份,那就没那么危险了,但是要小心环境中的
WEB=/

我真的不能说这是“糟糕的做法”,但我会说,任何时候你在脚本中使用rm-rf都会带来危险;)


通常我要做的是创建一个名为/tmp/todelete的目录,其中包含我在脚本中要删除的所有数据,然后每隔几个小时通过cron作业擦除该目录。这样一来,如果出现问题,我就有时间在数据真正丢失之前捕获它。

检查变量是否设置了值可能是个好主意(防御性编程)

比如说

#!/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

一般来说,使用环境变量有点危险,但正如您所发现的,它们在某些地方可能非常危险。另一个危险来源是,如果您忘记设置/检查变量,其他程序可以在shell中任意设置变量


但是,您确实需要环境变量来使用类似于bash的shell来执行操作。如果你能在“危险”的地方避开它们(
rm
chmod
chown
,…),那就更好了。总的来说,我认为最好的方法是在移动东西和使用诸如
rm

之类的命令时更加谨慎,这是一种有趣的方法,特别是因为
mv
操作通常比较便宜(除非您移动的是物理驱动器)。有点像回收站或垃圾桶。s/defored//| | die一些我刚刚想到的东西:如果你小心你的/字符放在哪里,你可以减少伤害的可能性。例如
WEB=/home/server/WEB/
,然后
rm-rf$WEB
。这并不是严格等同的,但对于大多数意图和目的来说都是一样的。因此,如果$WEB不是偶然设置的,rm命令什么也不做,这比删除所有内容要好得多。不过,检查它们是否有像sudorm-rf这样的关键操作可能是个好主意。对于
ls$WEB
:)来说,这可能是一种过度杀伤力在执行
rm
命令时始终要小心,尤其是当涉及到
-r
-f
开关时:P。
#!/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