2012-08-31 65 views
4

例如,我想编写一个bash shell脚本来执行循环备份,其格式为rsync。我应该把它作为一个独立的脚本文件(backup.sh)还是将它包装在一个函数中(backup)?作为脚本文件,我可以运行它bash backup.sh。作为一个函数,我可以把它放在一个文件中,例如foo.sh,并在我登录时获取它,然后我可以简单地运行backup作为备份我的文件的命令。问题是,这两种策略有哪些缺点和优点?独立shell脚本与shell函数?

更一般地说,我想知道,在什么情况下,我应该实现一个功能作为一个独立的Shell脚本文件或作为一个shell函数?

我的一些想法:我知道一些图形会话(如KDE,Gnome等)在登录时输入不同的文件。如果想在图形启动的应用程序中使用shell函数(例如单击图标打开emacs),可能会造成一些混淆。但我更喜欢实现shell函数并将它们合并到文件中,我认为它们整齐有序。

任何其他想法或建议?

回答

4

将函数用于经常使用的事物。它们占用内存,并且在shell启动时需要解析 - 如果您从不使用函数,则解析它会被浪费。

将脚本用于需要很长时间的事情,而您很少这么做。每个调用的解析时间可以忽略不计,并且将脚本分开带来的清晰度是有益的。

因此,对于备份脚本,我强烈建议使用脚本而不是函数。

+0

这个标准对我来说似乎很模糊。我真的看不到脚本带来的清晰度。一个函数所需的资源往往是可以忽略的,不是吗? – RNA

+1

它们有点含糊,但如果我不会每小时使用一次该代码,它就属于脚本。我使用脚本来处理比我更频繁使用的东西。实际上,我在shell中有两个函数,其中一个是因为IT提供的'/ etc/profile'中的一个错误(bug:'unset pathmunge'不能删除函数;需要'unset -f pathmunge'),而我也没有创建另一个 - 我还没有追踪它的来源。我一直使用脚本;我有数百个在我的$ HOME/bin中。 [...继续...] –

+0

[...继续...]不要误解我的意思;有时间使用功能。我的许多脚本都包含函数,因为它们可以更轻松地编写脚本。但是我在我的主登录shell环境中没有太多功能。 –

1

蟒蛇般的解决方案:

#!/bin/bash 

caller_shlvl=$1 
shift 

backup() { 
    ... 
} 

if (($caller_shlvl < $SHLVL)); then 
    backup "[email protected]" 
fi 

你可以做两件事情之一:

bash script.sh $SHLVL other args 

当你调用脚本来运行备份,或者

source script.sh $SHLVL 
# Time passes 
backup firstarg secondarg etc 

它将在当前shell中定义函数但不执行它。

(有传$ SHLVL作为明确的第一个参数是最接近我能得到的用于模拟Python的

if __name__=="__main__": 

这不是很漂亮,而且很可能使这个答案不那么有用。)