Передача значений переменных из одного скрипта после выполнения первого скрипта, и мы выполняем второй скрипт вручную - PullRequest
2 голосов
/ 23 января 2020

У меня есть требование для достижения в сценарии оболочки.

Есть два сценария script1, script2. Когда я запускаю первый скрипт, две переменные создаются и имеют некоторые значения. Это завершит sh его исполнение. (значения будут прямо здесь, когда скрипт завершит выполнение, верно?)

Script2 будет снова выполнен вручную позже (не уверен, когда этот скрипт будет выполнен, может 30 минут или даже 1 день, как нам нужно что-то исправить после запуска script1).

Теперь я хотел получить переменные, которые были созданы в сценарии 1, в сценарий 2. Это возможно?

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Не генерируйте контент для source редактирования или eval редактирования, если вы не готовы решать проблемы безопасности, связанные с ним.

Гораздо безопаснее написать поток с разделителями NUL (тот же формат, который Linux использует для представления содержимого переменных среды в /proc/*/environ):

tempfile=$(mktemp vars.XXXXXX)
for varname in var1 var2; do
  printf '%s=%s\0' "$varname" "${!varname}"
done >"$tempfile"
mv -- "$tempfile" varfile  # this is an atomic operation, so you can't have a half-written varfile

... и затем прочитать его обратно:

while IFS= read -r -d '' assignment; do
  [[ $assignment = *=* ]] || { printf 'ERROR: No = found in %q\n' "$assignment" >&2; continue; }
  var=${assignment%%=*}
  value=${assignment#*=}
  printf -v "$var" %s "$value"
done <varfile
1 голос
/ 23 января 2020

Редактировать:

Ответ Чарльза является правильным, поскольку это может привести к внедрению кода, но если вас не волнует безопасность (, вы должны) , тогда это будет работать.

Использовать источник или "." и экспортировать переменные в файл

script1. sh:

var1='foo'
var2='bar'
cat > varfile <<-EOF
    var1="${var1}"
    var2="${var2}"
EOF

script2. sh:

. varfile
echo "${var1} ${var2}"

выход:

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