/ / Jak zmienić zmienną globalną w skrypcie bash z zewnątrz, aby zmiana została odzwierciedlona w pętli while? - linux, bash, ubuntu

Jak zmienić zmienną globalną w skrypcie bash z zewnątrz, aby zmiana została odzwierciedlona w pętli while? - linux, bash, ubuntu

Mam skrypt bash w Ubuntu, który aktywuje funkcję (którą również napisałem), która znajduje się w tym samym skrypcie i ustawia ją do działania w tle w następujący sposób:

my script:
.
.
my_func &
do some stuff (that i don"t know how much time it"s gonna take)
global_var=1

my_func jest funkcją, która ma pętlę while i jej warunkiem jest uruchomienie

global_var -ne 1

Ale to nie działa. Po zmianie wartości na 1 poza pętlą zmiana wydaje się nie propagować do funkcji, ponieważ pętla while działa.

my_func gromadzi statystyki dotyczące wydajności mojego skryptu, więc musi być wdzięczny i mogę „po prostu wymusić jego zabicie po zakończeniu programu. Dlatego muszę być w stanie powiedzieć, żeby przestał.

Potrzebujesz pomocy, aby go zatrzymać.

Odpowiedzi:

0 dla odpowiedzi № 1

po uruchomieniu tej funkcji w tle nie udostępnia dostępu ani pamięci za pomocą skryptu, który go uruchamia. musisz zastosować inną metodę.

najbardziej eleganckim sposobem byłoby sprawdzenie, czy nie możeszuzyskać funkcję, która sama zrozumie, że musi się zatrzymać. Jeśli jednak nie jest to możliwe w twojej sytuacji, jedną z najstarszych i najłatwiejszych metod jest posiadanie współdzielonego pliku danych, wypełnionego dowolnymi zmiennymi, które muszą być wspólne dla skryptów.

więc zamiast global var, piszesz do vars.txt, stopfunction = 1 iw skrypcie w tle stale sprawdza ten plik (lub bazę danych) w każdej pętli, aby zobaczyć, jaka jest zmienna.

alternatywnie, jeśli twój program zezwala na ten format, możesz eksportować dane. umieść swoją funkcję w innym skrypcie powłoki i uruchom go od pierwszego w tle.

#!/bin/sh

globalvar="something"
export globalvar
./2.sh &

echo "finished"

a następnie w 2.sh

#!/bin/sh

sleep 5
echo "this is global: $globalvar"

na przykład nie wiem, czy to zadziała w twoim przypadku, ale użyłem podobnych sztuczek dla skryptów, jak to, co brzmi tak, jak próbujesz to zrobić.

choć ta metoda wymagałaby, aby zmiana globalnej var i wywoływanie skryptu stało się jakąś większą pętlą, nawet jeśli są asynchroniczne.