我有一组 bash 函数,其中包含详细级别选项。根据设定值,产生不同级别的输出。详细程度对于每个函数来说都是局部的。
但我也有环境变量。其中之一还指定了详细级别。它是一个专门用于影响新终端 shell 的全局详细工具。如果使用环境变量并将其设置为级别 1,则会打印可用终端命令的摘要。
假设使用详细位置参数调用函数,同时还设置了环境变量,大多数用户期望的行为是什么?强制执行本地详细程度设置,还是使用环境变量级别?
答案1
函数不是子 shell。您对函数中的变量所做的任何更改都将传播,除非您将它们附加local
您可以通过将函数括在括号中来使其成为子 shell()
在示例中test.sh
:
#!/bin/env bash
function amiasubshell {
DISPLAY=$1
echo amiasubshell: $DISPLAY
}
function nobuticanfakeit {
local DISPLAY=$1
echo nobuticanfakeit: $DISPLAY
}
echo main: $DISPLAY
amiasubshell :2
echo main: $DISPLAY
(amiasubshell :5)
echo main: $DISPLAY
nobuticanfakeit :28
echo main: $DISPLAY
第一个实例amiasubshell
改变了主体中向前移动的值。第二个实例没有,因为它是一个子 shell。的实例nobuticanfakeit
仅更改函数上下文中的值,因为它是local
变量:
main: :0
amiasubshell: :2
main: :2
amiasubshell: :5
main: :2
nobuticanfakeit: :28
main: :2