Bir komut dosyasını başka bir komut dosyası için çağırın, ancak çocuk çıkış çağırırsa üst öğeden çıkmayın


11

first.sh:

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

Bir second.shhata algılar ve -9 durumuyla first.shçıkarsa, her zaman çıkar. Çocuk kabuğu çıkarsa ilk kabuktan çıkmayı nasıl önleyebilirim?

Düzenleyemiyorum second.sh.


Burada ., geçerli kabukta başka bir dosyaya kaynak sağlayan komutu kullanıyorsunuz . Alt kabuk veya alt kabuk dahil değildir. Bunları yürütmek second.sh ve third.shkaynak yapmak yerine mi demek istediniz ?
Celada

evet .. yerine execute yazmalıyım. ./? "çıkış $?" inside second.sh .. düzenlemek second.sh?
user3589887

Yanıtlar:


13

Burada yaptığınız , aynı süreçte çalışan ve kabuk programlamasında “kaynak bulma” olarak adlandırılan alt komut dosyaları olarak second.shve bunu içerir third.sh. . ./second.shtemel olarak second.sh, o noktadaki metnin dahil edilmesine eşdeğerdir . exitKomut bir önemi orijinal komut dosyası veya bir kaynaklı senaryoya diyoruz olmadığını değil, süreç çıkar.

Yapmak istediğiniz tüm komutları çalıştırılırsa second.shve third.shonlar çocuk süreçler olarak bu komut dosyalarını çağırmak, erişmeniz gereken veya orijinal komut değişkenleri ve işlevleri değişiklik yapmayın.

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

Değişkenlere ve işlevlere orijinal komut dosyasından erişmek, ancak bunları değiştirmek için diğer komut dosyalarına ihtiyacınız varsa, bu komut dosyalarını alt kabuklarda çağırın. Alt kabuklar ayrı süreçlerdir, bu nedenle exityalnızca bunlardan çıkar.

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"

Eğer tanımlanan değişkenleri veya işlevleri kullanmanız gerekiyorsa second.shve third.shebeveyn komut, o zaman bunları kaynak tutmak gerekir.

returnYerleşik çıkışları sadece kaynaklı senaryo değil, tüm süreç - başka senaryo da dahil arasındaki bazı farklılıklar biri .komuta ve ana komut metnini içeren. Kaynaklı komut dosyaları exit, iç işlevlerin aksine, yalnızca üst düzeyden çağırıyorsa , exitiçine geçebilirsiniz return. Bunu, bir takma ad kullanarak komut dosyasını değiştirmeden yapabilirsiniz.

#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"

Eğer exitaynı zamanda fonksiyonları içine denir, ben olmayan bir hantal bir yolu vardır sanmıyorum. Hantal bir yol, bir çıkış tuzağı ayarlamak ve kodunuzu oraya koymaktır.

#!/bin/ksh
do_first () {
  echo "prova"
  trap "after_second" EXIT
  . ./second.sh
  after_second
}
after_second () {
  echo "ho lanciato il secondo"
  trap "after_third" EXIT
  . ./third.sh
  after_third
}
after_third () {
  trap - EXIT
  echo "ho lanciato il terzo"
}
do_first

Bu nedenle '.' Kullanmayı bıraktım. dosyaları komut dosyasına dönüştürmek ve bunun yerine yalnızca 'kaynak' kullanmayı deneyin. Bir bash 'en iyi uygulama' olarak kabul edilmesi gereken IMO, çünkü kodunuzun ne yaptığını çok daha açık hale getiriyor.
Mark E. Hamilton

6

İkinci ve üçüncü kabuğu kaynaklamak yerine, diğer komutlarda yaptığınız gibi çalıştırın. Çıkış kodu, gerekirse aşağıdaki gibi saklanabilir ve kullanılabilir:

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...

STATUS1=$?sonucundan bağımsız olarak daha önce yayınlanan eko komutunun sonucunu yakalar ./second.sh.
Cromax

@Cromax tamamen haklısın. Yanıt düzenlendi.
Dale Anderson

0

Bu şekilde deneyin (ilk .aramada kaldırın second.sh):

first.sh:

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

Bunun nedeni, ikinci komut dosyasının .birincinin sourceparçası olarak dahil edilmesine neden olan kısa kod olmasıdır.

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.