Экспорт переменных между сценариями оболочки - PullRequest
6 голосов
/ 15 апреля 2011

У меня есть два независимо работающих скрипта.первый скажем, скрипт A вычисляет некоторые значения.И я хочу повторить эти значения из другого скрипта с именем B. Эти скрипты не будут вызывать друг друга.Я использовал ключевое слово экспорта, но не работал.Как я могу это сделать?

Ответы [ 6 ]

6 голосов
/ 16 апреля 2011

Если я понял требование, тогда оба сценария не могут быть просто выполнены в одной и той же вложенной оболочке независимо друг от друга, но без вызова друг друга или без необходимости использования внешнего файла или канала, подобного этому:

Допустим, это ваш script1.sh

#!/bin/bash
# script1.sh: do something and finally
export x=19

А вот нам ваш script2.sh

#!/bin/bash
# script2.sh: read value of $x here
echo "x="${x}

Просто назовите их в той же под-оболочке, как это

(. ./script1.sh && ./script2.sh)

ВЫВОД:

x=19
4 голосов
/ 15 апреля 2011
 mkfifo /tmp/channel

 process_a.sh > /tmp/channel&
 process_b.sh < /tmp/channel&

 wait

Конечно, вы также можете просто прочитать одну строку, когда захотите.

В bash есть функции, которые также могут быть вашими.Случайный пример с этой страницы

# let the output of the coprocess go to stdout
{ coproc mycoproc { awk '{print "foo" $0;fflush()}' ;} >&3 ;} 3>&1
echo bar >&${mycoproc[1]}
foobar

ksh имеет аналогичную функцию, по-видимому

1 голос
/ 15 апреля 2011

Думайте о каждом скрипте как о функции: функция A вычисляет некоторое значение и возвращает его. Он не знает, кто это будет называть. Функция B принимает некоторое значение и повторяет его. Неважно, кто произвел это значение. Итак, сценарий А:

#!/bin/sh
# a.sh: Calculate something and return the result
echo 19

и сценарий B:

#!/bin/sh
# b.sh: Consume the calculated result, which passed in as $1
echo The result is $1

Сделать их исполняемыми:

chmod +x [ab].sh

Теперь мы можем склеить их вместе в командной строке:

$ b.sh $(a.sh)
The result is 19

Семантически, b.sh не вызывал a.sh. Вы вызвали a.sh и передали его результат в b.sh.

0 голосов
/ 28 июня 2012

На самом деле все, что вам нужно - это source, вы можете пропустить префикс export.

Мой вариант использования был файлом настроек, специфичным для конкретной среды, например:

В пределах main_script.sh

THIS_DIR=`dirname $0`
source $THIS_DIR/config_vars.sh
# other commands

В пределах config_vars.sh

LOCAL_ROOT="$HOME/folder/folder"
REMOTE_USERNAME='someuser'
BACKUP_FOLDER="$LOCAL_ROOT/folder"
# etc.
0 голосов
/ 15 апреля 2011

Вы можете выводить значения в файлы, тогда другой скрипт может их прочитать. Если вы хотите использовать его как параметр для чего-то, используйте обратный апостроф:

echo `cat storedvalue`

Будьте осторожны, если два сценария работают одновременно, могут возникнуть проблемы с параллелизмом, которые могут вызвать редко появляющиеся, мистически выглядящие ошибки.

0 голосов
/ 15 апреля 2011

Разве вы не можете прочитать третий файл, скажем, settings.sh с общими экспортируемыми переменными?

# common.sh
export MY_PATH=/home/foo/bar/
export VERSION=42.2a

и в A и B source common.sh для загрузки этих значений.

Обратите внимание, что в этом случае экспорт может не потребоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...