2011-04-19 73 views
2

当我将一个变量定义从脚本文件移动到另一个脚本文件以及其他几行代码时,我正在维护一些用于在开发服务器上自动构建的shell脚本。其结果是,这条线:在rm -rf语句中使用环境变量是不好的做法吗?

WEB=/home/server/web 

得到了从脚本文件到另一个脚本文件移动,并不再在由第一脚本文件使用的环境。因此,在文件后面,

rm -rf $WEB/* 

得到评估,以Linux的用户可怕的命令:rm -rf /*

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

if (foo) 
    bar() 
    bar2() 

其中移除变量声明的影响不会立即明显,可奇怪的路线?或者我应该在移动这样的东西时更加小心吗?

+0

我只是想说些什么:如果你很小心你把/你的角色放在哪里,你可以减少伤害的可能性。例如。 'WEB =/home/server/web /',然后是'rm -rf $ WEB'。这不完全等同,但是对于大多数意图和目的。因此,如果$ WEB没有被意外设置,那么rm命令不会执行任何操作*,这比删除所有内容要好得多。 – crazy2be 2011-04-19 01:53:13

回答

0

我认为分配竟是(无$):

WEB=/home/server/web 

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

如果转让是不是在脚本,或仅在脚本违约,则是比较危险的,但它仍然是合法的使用它:

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

rm -fr $WEB/* 

这意味着“如果环境变量$WEB被设置为非空值,使用它;否则使用值/home/server/web'。 $WEB这个值应该进行健全性检查,特别是如果root将运行该脚本。请注意,值为$WEB的尾随空白可能会造成意外的破坏。

然而,它成为一个判断呼叫。我可能不会这样做;用于删除内容的环境变量太容易受到意外或故意滥用的影响。我可能需要将传递的值作为参数传递给脚本。但是使用环境变量并不是正式的错误;这只是有点危险。如果你有好的备份,它不是那么危险,但要注意环境中的WEB=/

2

我真的不能说这是“不好的做法”,但我要说的是,任何时候你正在做的它与危险造成的脚本的室射频)

通常我会做什么是创建一个名为/ tmp/todelete的目录,它们在我的脚本中将删除所有要删除的数据,然后每隔几个小时通过cron作业擦除该目录。那样的话,如果有什么事情发生,我有时间在数据真正被丢弃之前赶上它。

+0

这是一个有趣的方式,尤其是因为'mv'操作通常很便宜(除非您正在物理驱动器之间移动)。有点像回收站或垃圾。 – crazy2be 2011-04-19 01:43:33

+1

s/wrought/[fraught](http://www.oed.com/view/Entry/74315)/ ||死了 – tchrist 2011-04-19 02:18:50

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 
+0

那么,这个变量最初是在同一个脚本中设置的,所以这看起来有点过度:P。 – crazy2be 2011-04-19 01:55:49

+0

同意。尽管检查他们的关键操作,如'sudo rm -rf'可能是一个好主意。可能是'ls $ WEB'的矫枉过正。 :) – spockaroo 2011-04-19 02:01:13

0

一般使用环境变量是有点危险,但你已经发现他们在某些地方会非常危险。另一个危险源是如果您忘记设置/检查变量,可以通过其他程序在shell中任意设置变量。

然而,你真的需要环境变量来使用像bash这样的shell来完成任务。如果你可以在“危险”的地方避免他们(rm,chmod,chown,...),那么好多了。总的来说,我认为最好的方法是在移动东西并使用诸如rm之类的命令时更加谨慎。

+0

'rm'命令总是很好,特别是涉及'-r'和'-f'开关时:P。 – crazy2be 2011-04-20 03:09:27

相关问题