分发 shell 脚本的正确方法

分发 shell 脚本的正确方法

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

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

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

答案1

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

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

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

. /path/to/your/script

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

sh -f /path/to/your/script

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

请注意,有一些脚本旨在获取而不是执行,因为它们的目的是更改 cwd 或设置环境变量等必须反映在源 shell 环境中的事情,但这些只占少数它通常作为商定协议的一部分来完成。这些文件可以被认为更像是它们期望来源的任何系统的“插件”,而不是独立的脚本。例如,名称/etc/rc*.d以 结尾的文件.sh由启动脚本子系统获取,而不是执行,并且有记录表明,如果您将具有此类名称的文件放入其中,/etc/rc*.d并且在完成时这是故意完成的,则会发生这种情况。其他地方也遵循命名旨在获取而不是以这种方式执行的文件的约定,但并不普遍。

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

相关内容