例如,我想编写一个bash shell脚本来使用rsync
进行旋转备份。我应该将其作为独立脚本文件(backup.sh
)或将其包装在函数(backup
)中吗?作为脚本文件,我可以运行它bash backup.sh
。作为一个函数,我可以将它放在foo.sh
这样的文件中,并在我登录时获取它,然后我可以简单地运行backup
作为备份我的文件的命令。问题是,这两种策略的缺点和优点是什么?
或者更一般地说,我想知道,在什么情况下,我应该将功能实现为独立的Shell脚本文件还是shell函数?
我的一些想法:我知道一些图形会话(例如KDE,Gnome等)在登录时会提供不同的文件。如果想在图形启动的应用程序中使用shell函数(例如单击图标打开emacs),可能会引起一些混淆。但是我更喜欢将它们作为shell函数实现并将它们组合成文件,我认为这些文件整齐有序。
还有其他想法或建议吗?
答案 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__":
它不漂亮,可能使这个答案不那么有用。)