独立shell脚本与shell函数?

时间:2012-08-31 16:08:55

标签: bash function shell

例如,我想编写一个bash shell脚本来使用rsync进行旋转备份。我应该将其作为独立脚本文件(backup.sh)或将其包装在函数(backup)中吗?作为脚本文件,我可以运行它bash backup.sh。作为一个函数,我可以将它放在foo.sh这样的文件中,并在我登录时获取它,然后我可以简单地运行backup作为备份我的文件的命令。问题是,这两种策略的缺点和优点是什么?

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

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

还有其他想法或建议吗?

2 个答案:

答案 0 :(得分:4)

将功能用于您经常使用的功能。它们占用内存并在shell启动时需要解析 - 如果你从不使用该函数,则解析哪些是浪费的。

将脚本用于需要很长时间的事情,这些事情很少发生。每次调用解析时间可以忽略不计,并且使脚本分离的清晰度是有益的。

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

答案 1 :(得分:1)

类似python的解决方案:

#!/bin/bash

caller_shlvl=$1
shift

backup () {
    ...
}

if (( $caller_shlvl < $SHLVL )); then
    backup "$@"
fi

你可以做以下两件事之一:

bash script.sh $SHLVL other args

在调用脚本时运行备份,或

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

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

(必须传递$ SHLVL作为显式的第一个参数是我可以模拟Python的最接近的

if __name__=="__main__":

它不漂亮,可能使这个答案不那么有用。)