2012-01-26 7 views
6

Jestem programistą C/C++ i ogólnie rzecz biorąc jestem głupi (a przynajmniej sposób, w jaki bash robi rzeczy, przez co czuję się zagubiony) . Nie mogę owinąć głowy wokół process substitution.Bash ustawia zmienną globalną w pętli i zachowuje jej wartość - Lub przetwarzaj podmianę dla manekinów

Potrzebuję zdefiniować globalną wartość logiczną, ustawić ją gdzieś w pętli i użyć jej w zasięgu globalnym. Czy ktoś mógłby proszę wyjaśnić w najprostszy możliwy sposób, jak dostosować poniższy kod, aby umożliwić mi osiągnięcie mojego przypadku użycia, na tyle prostego, że nie będę musiał jutro wykręcać mojego mózgu, aby spróbować uchwycić proces zastępowania.

# DEFINE HERE 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -d "data$i" ]; then 
# SET HERE 
       echo "data$i does not exist. Creating..."; 
       mkdir data$i 
     fi 
done 

# TEST AND USE HERE 

Szczerze mówiąc, nie sądzę, że bash wykonuje to zadanie .... następny blok wygląda tak.

echo "-------------------------------------------------------------------------------" 
echo "checking the state of potentially running daemons" 
for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -e "data$i/mongod.lock" ] ; then 
       echo "[no lock file] mongod process $i does not exist" 
     else 
       echo "[lock file exists] process $i lock file exists " 
       I_PID=`cat data$i/mongod.lock` 

       if [ ! ${I_PID} ]; then 
         echo " [GOOD] lock pid empty" 
       elif [ "`ps -p ${I_PID} | grep ${I_PID}`" ]; then 
         echo " [GOOD] data1 pid: ${I_PID} running" 
       else 
         echo "[PROBABLY FATAL] data1 pid: ${I_PID} not running." 
       fi 
     fi 
done 
echo "-------------------------------------------------------------------------------" 

Co ja teraz trzeba to globalna tablica elemencie tak, że mogę pętlę nad nimi oraz podjęcie działań warunkową zainicjować moje demony poprawnie: /.

Might just use libc and do this stuff in lua, jedynym powodem, powstrzymywać się konieczności instalowania skały, nie lubię ad-hoc repozytoriów kodu wymiotów, co chcą na moim komputerze: D

Odpowiedz

1

mógłbym misundestood ale ...

bool=false; 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
    if [ ! -d "data$i" ]; then 
      bool=true; 
      echo "data$i does not exist. Creating..."; 
      mkdir data$i 
    fi 
done 

if [ $bool = true ]; then 
    ... 
fi 

Czy tego chcesz?

+0

tak, to byłby mój pierwszy życzenie. Drugim moim pragnieniem jest śledzenie tablicy MxN. –

8

Ważne jest, aby zrozumieć, że proces potomny rodzi się z własnym środowiskiem i nie może wpływać na zmienne jego rodzica. Jeśli ustawisz zmienną w procesie potomnym, nie wpłynie to na wartość zmiennej w obiekcie nadrzędnym. Są to właściwie dwie różne zmienne, które po prostu mają tę samą nazwę.

Drugą rzeczą, którą należy zrozumieć, jest to, że bash wykonuje polecenie jako proces potomny. Istnieją dwa przypadki dotyczące pytania:

  1. Każdy proces połączony przez rurę | jest potomkiem bieżącej powłoki.
  2. Uruchomienie pojedynczego wbudowanego polecenia z przekierowaniem (np. <) nie spowoduje odrodzenia procesu potomnego.

Oto prosty sesja, która pokazuje te pomysły:

$ somevar=initial 
$ echo test1 | read somevar 
$ echo $somevar 
initial 
$ read somevar < <(echo test2) 
$ echo $somevar 
test2 

Pierwszy read jest procesem dziecko i dlatego somevar w głównej powłoce nie zmienia. Druga read jest wykonywana przez samą główną powłokę, a tym samym aktualizowana jest somevar.

Oznacza to, że kod będzie działał zgodnie z oczekiwaniami chyba dodawać rury przed lub po pętli for, czyli działa to jak chcesz go do:

# DEFINE HERE 
SOMEVAR=0 
DAEMON_COUNT=10 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -d "data$i" ]; then 
# SET HERE 
       SOMEVAR=10 
       echo "data$i does not exist. Creating..."; 
       mkdir data$i 
     fi 
done 

# TEST AND USE HERE 
echo ${SOMEVAR}  # This displays 10 
+0

nie konstruuje "za" implicite odradza proces potomny? Takie zachowanie przeżyłem, kiedy próbowałem. –

+0

Nie. W związku z tym Twój kod jest w porządku. Unikaj jednak rur :-) –

+0

drukuje zero na mojej maszynie :( –

Powiązane problemy