#shell #unix #solaris
#оболочка #unix #solaris
Вопрос:
У меня есть два сценария A и B. В сценарии B есть некоторые переменные, которые должны использоваться в A. Также я должен вызвать сценарий B через сценарий A. Как я должен это делать?
Комментарии:
1. Есть ли в скрипте B код, который не должен выполняться при вызове в скрипте A?
Ответ №1:
Похоже, у вас есть информация о конфигурации, которая может быть считана либо из A, либо из B, если это простая информация о конфигурации, тогда она должна быть указана в третьем файле C, который получен как из A, так и из B с использованием . ./C
механизма.
если вы пытаетесь вызвать B из A, установите переменную в вызове на B, а затем прочитайте это значение в A, тогда, если вы используете стандарт ./B
, все переменные, которые установлены при вызове B, не копируются обратно в среду A.
Наиболее разумный способ «совместного использования переменных» между сценариями — заставить вызываемый скрипт выводить переменные, которые A необходимо использовать, во временный файл, а затем извлекать их из A, как только B завершит его запуск. Более сложные способы включают в себя повторение переменных в оцениваемую строку, которая вычисляется в A, например, если B содержит:
#!/bin/bash -p
echo var=22
и затем в A я делаю:
output=$(./B)
eval $output
echo $var
Я бы получил результат 22
. Это сложно сделать правильно, и на него следует полагаться только для короткого списка переменных, передаваемых между сценариями.
Реальный способ заставить скрипты совместно использовать переменные — заставить их содержать только функции и иметь главный скрипт, который вызывает функции в A и B после их поиска, например
#!/bin/bash -p
. ./A
. ./B
do_a_stuff
echo $shared_variable
do_b_stuff
echo $shared_variable
если в A есть код, который зависит от кода в B, то, используя их, вы получаете единое пространство имен, которое является общим для них, поэтому вы можете вызывать функции в B из A и A из B (имейте в виду, что это нарушение функциональной иерархии и считается нарушением функциональной иерархии).плохое кодирование).
Комментарии:
1. отличный ответ, жаль, что OP не может быть немного более конкретным в отношении того, что они пытаются сделать;-), оставляя нам догадываться и 2-е предположение… Удачи всем.
Ответ №2:
Маржировать два сценария? Тогда у вас будет один список переменных, и все функции будут в одном месте. Если эти два сценария выполняют некоторые очень разные вещи, попробуйте сделать их независимыми.
Ответ №3:
Попробуйте
# cat B
#!/bin/bash
echo "Date is: `date`"
# cat A
#!/bin/bash
echo "You are login as: `whoami`"
echo "`/bin/sh ./B`" # exact path for the script file
вывод:
# ./A
You are login as: root
Date is: Thu Oct 17 02:56:36 EDT 2013