Цикл игнорирует изменение переменной из подоболочки в фоновом режиме

Вы могли бы также использовать арифметику для цикла как это:

a=(user1 pass1 user2 pass2)
for ((i=0; i<${#a[@]}; i+=2)); do
  echo "${a[i]}: ${a[i+1]}"
done
4
26.08.2015, 02:11
3 ответа

Символ & запускает фоновый процесс. Фоновый процесс выполняется асинхронно в подоболочке. Переменные можно передавать из родительской оболочки в подчиненную оболочку, а не наоборот. Однако вы можете найти обходной путь, если вам действительно нужно значение, установленное в дочерней оболочке:

boolean=$(mktemp) && echo "false" >$boolean
{ sleep 5 && echo true >$boolean && echo "boolean is true now" ; } &
{ until [ "$(cat $boolean)" = "true" ] ; do sleep 1 && cat $boolean ; done ; } &&
echo "boolean is true now: $(cat $boolean)"

Это создает временный файл, содержимое которого является логическим значением. В цикле до этот файл проверяется до тех пор, пока он не станет истинным.

Примечание:

Я рекомендую сделать следующее в вашем скрипте (если возможно):

{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."

wait ожидает завершения фонового процесса.

8
27.01.2020, 20:44

Для связи между основной и фоновой оболочками можно использовать сигналы:

#!/bin/bash

# global variable for foreground shell
boolean=false

# register a signal handler for SIGUSR1
trap handler USR1

# the handler sets the global variable
handler() { boolean=true; }

echo "before: $boolean"

# Here, "$$" is the pid of the foreground shell
{ sleep 5; kill -USR1 $$; echo "finished background process"; } &

# busy waiting
until $boolean; do 
    echo "waiting..."
    sleep 1
done

echo "after: $boolean"

output

before: false
waiting...
waiting...
waiting...
waiting...
waiting...
finished background process
after: true
12
27.01.2020, 20:44

Вы ошибочно предполагаете, что логическое значение , которое вы установили в true во второй строке, является тем же логическим, которое вы проверяете в до выписки . Это не тот случай, вы запускаете новый процесс с новой оболочкой в ​​фоновом режиме и логическим (тот, который вы проверяете), никогда не назначается.

4
27.01.2020, 20:44

Теги

Похожие вопросы