为什么shell变量在我的Ruby脚本中不可见?

时间:2018-05-01 07:23:35

标签: ruby bash

通过反引号或%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" 

1 个答案:

答案 0 :(得分:2)

这个问题确实与ruby无关;它只是关于bash变量的行为。

  

我发现当我在bash中声明一个新变量时,ruby脚本看不到它,直到我通过export命令创建环境。

子shell不继承其父shell的环境。您可以使用变量显式调用子shell,也可以export。 (那是export函数的整点!)

例如,请考虑以下内容 - 再次与ruby无关。

假设test.txt有以下几行:

line one
line two

请注意以下输出:

  1. 当变量声明为单独的命令时,传递给子shell:

    GREP_OPTIONS='-v'
    grep one test.txt
    
    // Result:
    line one
    
  2. 当变量设置为同一命令的一部分时, 传递给子shell:

    GREP_OPTIONS='-v' grep one test.txt
    
    // Result:
    line two
    
  3. 当变量导出时, 传递给子shell:

    export GREP_OPTIONS='-v'
    grep one test.txt
    
    // Result:
    line two