Bash 脚本是一个强大的工具,开发人员可以利用它在 Unix 和 Linux 系统上自动执行任务。一种常见的用例是在另一个脚本中获取一个脚本,从而允许在它们之间共享变量和函数。但有时,了解 Bash 脚本是否已获取或直接执行是至关重要的。这些知识有助于根据程序的调用方法控制程序的流程。
本指南将探讨如何识别 Bash 脚本是直接获取的还是直接执行的。
了解 Bash 脚本的直接执行和来源
在我们深入检测脚本调用方法之前,让我们先澄清一下 Bash 脚本的来源和直接执行之间的区别。
-
直接执行:当您直接运行脚本时,系统会生成一个新的 shell 进程并在这个新 shell 中执行脚本。脚本中定义的变量和函数仅在该新 shell 的范围内可用,并且在脚本执行完成后将丢失。
-
Sourcing:另一方面,如果您获取脚本,它将在同一 shell 中执行。这意味着即使脚本完成执行后,脚本定义或修改的任何变量或函数仍将在 shell 中保持可用。脚本的来源是通过 source 命令或点运算符 (.) 来实现的。
在 Bash 中检测源脚本和直接执行的脚本
要确定脚本是否是源代码或直接运行,我们可以使用 $0 和 BASH_SOURCE 变量。
在巴什中,`$0`保存正在执行的脚本的名称。当直接运行脚本时,`$0`将包含脚本本身的名称。
`BASH_SOURCE`是一个保存源历史记录的数组变量,其中`${BASH_SOURCE[0]}`是当前子程序调用的源,`${BASH_SOURCE[1]}`是当前子程序的调用者的来源,依此类推。如果有脚本来源,`${BASH_SOURCE[0]}`将包含脚本本身的名称。
让我们看看如何利用这些变量来检测脚本是否正在获取或直接运行:
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]
then
echo "Script is being run directly."
else
echo "Script is being sourced."
fi
在此代码中,如果`${BASH_SOURCE[0]}` equals `$0`,然后直接运行脚本。否则,它正在被采购。
了解如何调用脚本的含义
了解脚本的调用方式在多种情况下都非常有用。例如,您可能有一个脚本,既可以为其函数获取资源,也可以直接为其命令行界面运行。通过检测调用方法,您可以相应地控制脚本的行为。
这是一个简单的例子:
# function definitions...
function1() { ... }
function2() { ... }
# if script is run directly, execute a command
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
function1
function2
fi
在这个脚本中,功能1 and function2仅当直接运行脚本时才会执行。如果是源代码,则仅处理函数定义,而不执行任何命令。
结论
Bash 提供了一些工具来确定脚本是来源还是直接运行。有了这些知识,开发人员就可以根据调用方法控制脚本的行为,从而产生更加灵活和模块化的代码。与任何编程概念一样,巩固理解的最佳方法是实践,因此请考虑如何在您自己的 Bash 脚本中应用此技术。