Linux'ta komut kullanımı beklensin mi?


16
#!/bin/bash
function back()
{
    sleep $1
    exit $2
}
back $1 $2 &
b=$!
if `wait $!`;then
    echo success
else
    echo failure
fi
bash-3.00# ./back 300 0
failure
bash-3.00# ./back 300 1
failure

success0 gönderdiğimde çıkış durumu bekliyordum , ama hala alıyorum failure.

Ayrıca, wait300 saniye beklemez. Bunun yerine, mesajı hemen alıyorum. Sanırım senaryomun $!hemen çocuğu $$. Öyle değil mi?

Beklemenin çıkış durumunu yakalamak mümkün müdür exit_status=$(wait $!)?

if ! ((exit_status));then
    echo sucess
else
    failure
fi

Yanıtlar:


20

Sorun, waitbir alt kabukta yayınlamanızdır :

if `wait $!`;then

Çünkü waitbir komut değildir, yerleşiktir, o anki kabuğunuzda değil , alt kabukta çalışır.

Gördüğünüz, ancak görmediğiniz çıktı:

wait: pid 12344 is not a child of this shell

... dönüş durumu 1.

Testinizi yapmak için alt kabuk kullanmadan yapmanız gerekir.

#!/bin/bash
function back()
{
  sleep $1
  exit $2
}
back $1 $2 &
b=$!

wait $b && echo success || echo failure

Bu beklediğiniz sonucu verir ve beklediğiniz sürece bekler:

$ time ./test.sh 3 0
success
./test.sh 3 0  0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1  0.00s user 0.01s system 0% cpu 3.012 total

Herhangi bir komutun çıkış durumunu aşağıdakilerle kontrol edebilirsiniz $?:

$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1

Senaryonuzda birkaç hata daha vardı. Senin #!hattın düzeltildi. Sen atamak $!için $b, ancak kullanmayın $b.


12

Çeneleri çıkarın.

Olduğu gibi, waitüst kabuğun işlerine erişimi olmayan bir alt kabukta yürütüyorsunuz , bu yüzden hemen başarısız olacak.


Çıkış durumunu istiyorsanız $?, beklemeden hemen sonra değerini alın .

command_here &
wait
status=$?

2

Geri tepmelerin kaldırılması, programın çalışmasını sağlar, ancak tamamen önceden belirlenmiş nedenlerden dolayı değil. waitBir alt kabukta çalıştığı ve üst öğesinin işlemlerine erişemediği için hemen başarısız olduğu doğrudur , ancak çalışan bir komut kullansanız bile program beklendiği gibi çalışmaz.

ifÇıkış durum sıfır veya sıfırdan ise ifadesi bir program ve kontroller çalışır. Backticks kullandığınızda, if ifadesi işlemin çıktısını alır, bir program olarak çalıştırmayı dener ve sonra bu işlem için çıkış kodunu kullanır. Yani program başarısız değil çünküwait başarısız , aksine waitçıktı üretmediği için başarısız oluyor .

Betiğin echoters tırnakları kullanarak çalışmasını sağlayabilirsiniz :

if `echo wait $!`; then
    echo success
else
    echo failure
fi

Ya da sadece gerdiricileri çıkarın; herkes için daha kolay.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.