David C. Rankin's helpful answer объясняет, почему ваш код не работает.
Примечание:
Следующее решение следует использовать только в том случае изменения скриптов вы работаете не вариант (решение может также представлять интерес, если вы хотите узнать о поиске и одноранговой переменных окружения).
В противном случае см. Решения, обсуждаемые внизу.
Чтобы решить вашу проблему, вы можете попробовать следующее:
x=$(trap 'printf %s "$x"' EXIT; . script1.sh >/dev/null) sh script2.sh
Заметим, однако, что:
script1.sh
будет - по необходимости - быть выполнена вашим текущей оболочки , который может быть или не быть sh
.
script1.sh
Выход выходного сигнала STDUT подавляется, поскольку должно быть обеспечено, что printf %s "$x"
является единственным выходом стандартного вывода, созданным подоболочкой внутри подстановки команд ($(...)
).
- Этот подход ограничен переменной (хотя он может быть расширен для вывода значений нескольких переменных, которые вызывающий скрипт должен затем анализировать обратно на отдельные значения).
. script1.sh
источники скрипт внутри подоболочки, что означает, что подоболочка выполняет script1.sh
непосредственно в своей собственной среде, и поэтому видит переменные сценария после его выполнения (что означает, что он будет видеть $x
, даже если бы не было экспорт).
trap 'printf %s "$x"' EXIT
устанавливает выходную ловушку; то есть код, который выполняется, когда подоболочка выходит, в этом случае printf %s "$x"
, которая просто выводит значение интересующей переменной.
Обратите внимание, что этот подход необходим для обеспечения печати значения $x
, даже если script1.sh
прекращается из-за заявления exit
; так как script1.sh
находится в состоянии подзаголовком у подоболочки, exit
выходит из всей подоболочки.
x=$(...)
фиксирует это значение, и, будучи предваряется командовать sh script2.sh
, эффективно делает полученную $x
среды переменную, которая script2.sh
затем видит.
Это вообще проблематичен исходные сценарии, которые не были разработаны, чтобы быть получено:
- всех переменных измененного или созданные с помощью сценария и любых изменений в среду оболочки выполняется по сценарию повлияет на вызывающую оболочку.
- , если такие скрипты выполняются
exit
, они также выйдут из вызывающей оболочки.
Если скрипты не могут быть изменены по какой-либо причине, решение выше является лучшим выбором, поскольку оно обходит эти проблемы, хотя и с некоторыми ограничениями.
Более надежные, универсальные решения (модификация сценариев требуется):
Имея сценарий, который устанавливает переменную окружения (ы) интересов сам вызвать другой сценарий является правильным решением , как показано в David's answer.
Если сценарии действительно должны работать как сверстники, значения должны быть переданы через файлов: есть сценарий, который устанавливает переменный (ы) интерес записывает свои значения в (временный) файл и имеют другие сценарий чтения файл:
script1.sh
:
#!/bin/sh
export x=19
# Write to temp. file named for the *parent* process ID.
# Since both script calls will have the same parent process, this
# allows you to avoid a static filename subject to name collisions.
printf %s "$x" > /tmp/x.$PPID
script2.sh
:
#!/bin/sh
# Read the value of $x from the temp. file, then delete the file.
x=$(cat /tmp/x.$PPID) && rm /tmp/x.$PPID
echo "x=${x}"
Среди часто задаваемых вопросов в Stack Overflow ['bash' tag wiki] (http://stackoverflow.com/tags/bash/info) вы можете заметить http://stackoverflow.com/questions/17852111/unable- to-export-the-variable-through-script-file и http://stackoverflow.com/questions/4277665/how-do-i-compare-two-string-variables-in-an-if-statement-in- bash - оба эти вопроса очень распространены. – tripleee
thanks @tripleee –