Почему переменные оболочки невидимы в моем скрипте на Ruby? - PullRequest
0 голосов
/ 01 мая 2018

Работая с выполнением оболочки Ruby с помощью обратной цитаты или синтаксиса %x, я обнаружил, что когда я объявляю новую переменную в bash, она не видна в сценарии ruby, пока я не сделаю ее средой командой export.

Пожалуйста, объясните механизм, почему переменные оболочки не видны скриптом?

# 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 голосов
/ 01 мая 2018

Этот вопрос на самом деле не имеет никакого отношения к ruby; это просто поведение переменных bash.

Я обнаружил, что когда я объявляю новую переменную в bash, она не видна в скрипте ruby, пока я не создаю ее в окружении командой export.

Подоболочки не наследуют окружение своей родительской оболочки. Вы можете явно вызывать вложенную оболочку с переменными, или вы можете export их. (Это вся точка функции export!)

Например, рассмотрим следующее - что опять-таки не имеет ничего общего с ruby.

Предположим, test.txt имеет следующие строки:

line one
line two

Обратите внимание на следующие выводы:

  1. Когда переменная объявляется как отдельная команда, она не передается в под-оболочку:

    GREP_OPTIONS='-v'
    grep one test.txt
    
    // Result:
    line one
    
  2. Когда переменная задана как часть той же команды, она передается в субоболочку :

    GREP_OPTIONS='-v' grep one test.txt
    
    // Result:
    line two
    
  3. Когда переменная экспортируется , она равна , передаваемая в подоболочку:

    export GREP_OPTIONS='-v'
    grep one test.txt
    
    // Result:
    line two
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...