分发 shell 脚本的正确方法

hog*_*oge 9 shell bash shell-script

如果 shell 的行为可以被修改set并因此是不可预测的,那么分发 shell 脚本的最正确方法是什么?

例如,rm *.txt不会在set -f已运行的环境中按预期执行。我应该如何确保rm *.txt在任何环境中删除当前目录中的所有文本文件?

在分发它们之前,我应该如何确保 shell 脚本按预期运行?

Cel*_*ada 7

Shell 脚本通常被视为与任何其他类型的可执行文件相同,例如二进制文件、Python 脚本、Perl 脚本或任何其他类型的脚本。它们在顶部有一个shebang,指示内核通过shell 执行它们。它们应该以与任何其他命令相同的方式被调用。

因此,每次调用脚本时都会启动一个新的 shell,并且诸如set -f调用 shell 或系统中任何其他 shell 实例中的任何设置都无关紧要。

当然,用户可以获取脚本而不是运行它,例如这样:

. /path/to/your/script
Run Code Online (Sandbox Code Playgroud)

或者在具有非默认设置的 shell 中执行它,如下所示:

sh -f /path/to/your/script
Run Code Online (Sandbox Code Playgroud)

但这些不被视为正常方式或调用您的脚本,并且这样做的用户应该期望他们得到的结果。

请注意,有一些脚本旨在获取而不是执行,因为它们的目的是更改 cwd 或设置必须反映在源 shell 环境中的环境变量之类的事情,但这些是少数它通常作为商定协议的一部分完成。这些文件可以被认为更像是它们期望来源的任何系统的“插件”,而不是独立的脚本。例如,文件中/etc/rc*.d有名称,在结束.sh由启动脚本子系统货源,没有执行,据记载,这是如果你把一个文件与这样的名字会发生什么/etc/rc*.d当它完成时,它是故意完成的。命名文件的约定旨在作为来源而不是以这种方式执行在其他地方也遵循,但并不普遍。

确实,打算以这种方式获取的文件必须注意其调用者环境中可能存在的可能影响 shell 行为的设置,但理想情况下,商定的协议应该承诺可预测的执行环境。