6

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

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

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

还有其他想法或建议吗?

4

2 回答 2

4

将函数用于您将经常使用的事物。它们占用内存并需要在 shell 启动时进行解析——如果你从不使用该函数,解析就会被浪费掉。

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

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

于 2012-08-31T16:15:20.927 回答
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__":

它不漂亮,并且可能使这个答案不太有用。)

于 2012-08-31T16:25:05.787 回答