通过反引号或%x
语法处理Ruby shell执行我发现当我在bash中声明一个新变量时,ruby脚本看不到它,直到我通过export
命令创建环境。
请解释为什么脚本无法看到Shell变量的机制?
# Shell and Environment variables.
V123='This is an variable. VAR HERE.'
echo $V123
# Read shell variable via Ruby
ruby -e 'p `echo $V123`' # "$V123\n"
ruby -e 'p %x[echo $V123]' # "$V123\n"
# Check SET for this var
set | grep V123
ruby -e 'p `set | grep V123`' # ""
ruby -e 'p %x[set | grep V123]' # ""
# Put this var itno the Environment
echo "--- Export"
printenv V123
export V123
printenv V123
echo "--- Ruby printenv"
ruby -e 'p `printenv V123`' # This is an variable. VAR HERE.\n"
ruby -e 'p %x[printenv V123]' # This is an variable. VAR HERE.\n"
答案 0 :(得分:2)
这个问题确实与ruby无关;它只是关于bash变量的行为。
我发现当我在bash中声明一个新变量时,ruby脚本看不到它,直到我通过
export
命令创建环境。
子shell不继承其父shell的环境。您可以使用变量显式调用子shell,也可以export
。 (那是export
函数的整点!)
例如,请考虑以下内容 - 再次与ruby无关。
假设test.txt
有以下几行:
line one
line two
请注意以下输出:
当变量声明为单独的命令时,不传递给子shell:
GREP_OPTIONS='-v'
grep one test.txt
// Result:
line one
当变量设置为同一命令的一部分时, 传递给子shell:
GREP_OPTIONS='-v' grep one test.txt
// Result:
line two
当变量导出时, 传递给子shell:
export GREP_OPTIONS='-v'
grep one test.txt
// Result:
line two