У вас есть в основном два варианта:
- Сделайте переменную переменной среды (
export TESTVARIABLE
) перед выполнением 2-го сценария.
- Исходный 2-й скрипт, т.е.
. test2.sh
и он будет работать в той же оболочке. Это позволит вам легко обмениваться более сложными переменными, такими как массивы, но также означает, что другой скрипт может изменять переменные в исходной оболочке.
ОБНОВИТЬ:
Чтобы использовать export
для установки переменной среды, вы можете использовать существующую переменную:
A=10
# ...
export A
Это должно работать в обоих bash
и sh
. bash
также позволяет комбинировать его так:
export A=10
Это также работает в моем sh
(что может быть bash
, вы можете использовать echo $SHELL
для проверки). Но я не верю, что это гарантированно сработает во всем sh
, поэтому лучше оберегать их и разделять их.
Любая переменная, которую вы экспортируете таким образом, будет видна в выполняемых вами скриптах, например:
a.sh:
#!/bin/sh
MESSAGE="hello"
export MESSAGE
./b.sh
b.sh:
#!/bin/sh
echo "The message is: $MESSAGE"
Затем:
$ ./a.sh
The message is: hello
Тот факт, что оба сценария оболочки также случайны. Переменные окружения могут быть переданы любому процессу, который вы выполняете, например, если вместо этого мы использовали python, он может выглядеть так:
a.sh:
#!/bin/sh
MESSAGE="hello"
export MESSAGE
./b.py
b.py:
#!/usr/bin/python
import os
print 'The message is:', os.environ['MESSAGE']
Sourcing:
Вместо этого мы могли бы получить такой источник:
a.sh:
#!/bin/sh
MESSAGE="hello"
. ./b.sh
b.sh:
#!/bin/sh
echo "The message is: $MESSAGE"
Затем:
$ ./a.sh
The message is: hello
Это более или менее «импортирует» содержимое b.sh
напрямую и выполняет его в той же оболочке . Обратите внимание, что нам не нужно было экспортировать переменную для доступа к ней. Это неявно разделяет все имеющиеся у вас переменные, а также позволяет другому сценарию добавлять / удалять / изменять переменные в оболочке. Конечно, в этой модели оба ваших сценария должны быть на одном языке ( sh
или bash
). Чтобы привести пример, как мы могли бы передавать сообщения туда и обратно:
a.sh:
#!/bin/sh
MESSAGE="hello"
. ./b.sh
echo "[A] The message is: $MESSAGE"
b.sh:
#!/bin/sh
echo "[B] The message is: $MESSAGE"
MESSAGE="goodbye"
Затем:
$ ./a.sh
[B] The message is: hello
[A] The message is: goodbye
Это работает одинаково хорошо в bash
. Это также позволяет легко обмениваться более сложными данными, которые вы не могли бы выразить как переменную среды (по крайней мере, без некоторой тяжелой работы с вашей стороны), например, массивами или ассоциативными массивами.