2016-08-13 2 views
2

Я хочу запускать функции f1 и f2 одновременно, а затем выполнять действие только тогда, когда они сделаны.
Похоже, что если функции заданы как в сценарии, изменения значения f1/f2done не отображаются сценарием, цикл до конца не завершается, и конечная строка не выполняется.bash variable scope issue with function fork (&)

  1. Как это осуществить?

Edit - дополнительные функциональные возможности, требуемые
2. Есть ли способ, которым я мог читать/писать на основных технологических переменных в скрипте (без использования файлов)?

Благодарим вас за чтение.

#!/bin/bash 

f1done="false" 
f2done="false" 

function f1 { 
    echo "f1: " 
    sleep 4 
    echo "f1 done." 
    f1done="true" 
} 

function f2 { 
    echo "f2: " 
    sleep 2 
    echo "f2 done." 
    f2done="true" 
} 

f1 & 
f2 & 

until [[ "$f1done" == "true" && "$f2done" == "true" ]]; do 
    echo "$f1done $f2done..."; 
    sleep 3; 
done 

echo "Both done." 
+3

вещи выполняются в фоновом режиме в отдельных процессах; изменения в них не могут повлиять на родительский процесс. –

+0

Вы ищете многопоточность, и bash не поддерживает это. Были некоторые разговоры о оболочке korn (ksh), поддерживающей многопоточность (http://kornshell.com/doc/faq.html Q7), но я не думаю, что это произошло. Кроме этого, я не знаю ни одной оболочки, что многопоточность, вам нужно что-то вроде C, C++ или Java. – cdarke

ответ

4

f1 и f2 будут отдельные процессы, таким образом, имеющие отдельный адресное пространство от основного процесса. Поэтому ваша петля будет бесконечной.

Вместо этого вы должны использовать wait.

т.е.

изменение

until [[ "$f1done" == "true" && "$f2done" == "true" ]]; do 
    echo "$f1done $f2done..."; 
    sleep 3; 
done 

к

wait; 
wait; 
+0

Спасибо Ed, инструкция wait работает красиво. См. Мой вопрос для дополнительного требования. – user1330734

+0

Второй 'wait' не нужен; 'wait' без аргументов не завершается до тех пор, пока не завершится * все * фоновые процессы. – chepner