我目前正在 Debian 12.X 上使用以下 bash 运行各种脚本:
GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
我有以下方法/选项来执行脚本。
每种方法都有以下影响或选项:
Method | New Process | Shell Ends with exit | Variables Persist |
------------------------------------------------------------------------
./script | YES | NO | NO |
------------------------------------------------------------------------
bash script | YES | NO | NO |
------------------------------------------------------------------------
. ./script | NO | YES | YES |
------------------------------------------------------------------------
source script | NO | YES | YES |
------------------------------------------------------------------------
@terdon
请注意,. ./script 和 source script 完全相同。标准命令是 .,bash 也提供同义词 source,但两者除了名称之外没有区别。
根据我用来启动和结束脚本的方法,我可以在当前 shell 或终端会话中重用不同的变量和选项,如果它们没有被终止/关闭/注销,则可以不重用它们。
./script
如果我使用或 bash运行脚本script
,则会启动一个新的 shell 实例,并且其中设置的环境变量仅在该实例中有效。
脚本结束后,这些变量就会丢失。
但是,如果我使用 运行脚本. ./script
,变量将保留在父 shell 会话中,因为它们直接影响当前 shell。
在这种情况下,如果我希望这些变量在会话的剩余时间内可用而无需手动重置它们,那么了解这些变量是否会在父会话中持续存在是至关重要的。
例如,我还可以决定脚本是以 exit 还是 return 结束,并且根据该决定是否发生注销或关闭 shell。
所以,它会影响后续的其他步骤。
我是否可以在脚本中检测它是如何简单易行地启动的,即使用了哪种方法,以便将值存储在变量中,然后在启动时不传递参数的情况下进一步处理它?
如何定义一个要获取而不是运行的 shell 脚本解决了问题的突出部分 — — 但是我不会将其作为重复项关闭,因为它并没有从字面上解决这个问题。
BASH_SOURCE
在 Bash 中,你可以通过比较数组和来区分运行和执行脚本$0
:假设您的脚本在其shebang中指定了Bash,我认为没有办法区分
./script
,bash script
但由于就您的表而言,两者的行为相同,所以这应该不是问题。