`Yerel 'çıkış kodunu yakalama nasıl yapılır?


11

Projemde şu snippet var:

local output="$(bash "${1##*/}")"
echo "$?"

localAncak kaldırma işlemi local, $?değişkenin doğru davranmasına neden olduğu için sıfır olarak yazdırır : bu, alt koddan çıkış kodunun alınmasıdır.

Benim sorum: çıkış değerini yakalarken bu değişkeni nasıl yerel tutabilirim?


1
shellchecksadece bu sorunu yakalamakla kalmaz, çözümü unix.stackexchange.com/a/281749/24718 adresinden de önerebilirsiniz !
Waleed Khan

Yanıtlar:


16
#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

Bu, 127"komut bulunamadı" için doğru hata kodunu yansıtacaktır .

localBirden fazla değişken tanımlamak için kullanabilirsiniz . Ben de başarılı RETolmadan önce sıfır localve alt $?sıfıra çıkış kodunu yakalamak için yerel değişken oluşturmak .


bashBu ifadenin soldan sağa değerlendirilmesi garanti ediliyor mu?
Max Ried

Bildiğim kadarıyla, değişken atamaları sırayla, bu bağlamda soldan sağa, evet.
DopeGhoti

Bunun güvenilir bir şekilde çalıştığı gerçeği, evet olduğunu gösteriyor gibi görünüyordu. Ancak, ne POSIX ne de bashreferans kılavuzundan bu konuda hiçbir bilgi bulamıyorum .
kedi

10
Bir kenara, all-caps değişken isimlerini kullanmak kötü formdur. Tüm büyük harfli adları kabuk veya sistem için anlamlı değişkenler ve en az bir küçük harfli isimler için ayrılmış olarak tanımlayan pubs.opengroup.org/onlinepubs/009695399/basedefs/… adresindeki POSIX ortam değişkeni spesifikasyonuna bakın. kabuk tanımlı değişkenlerin ve ortam değişkenlerinin bir ad alanını paylaştığını akılda tutarak uygulama tanımlı kullanım için ayrılmıştır (çarpışma durumunda öncekine atama, ikincisini geçersiz kılabilir).
Charles Duffy

Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
terdon

27

Yerel değişkeni atamadan önce bildirin:

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

Bence bu, ek bir RETdeğişken ayarlamaktan daha okunabilir . YMMV, ancak beklediğiniz gibi çalışır.


2
Bu çok basit: Birden atamalarının dönüş kodunu kontrol etmek istiyorsanız ayrı bir değişken kullanmak yerine, hem açık olmalı daha iyi local var1 var2 ...ve Bob senin amcan.
l0b0

@ l0b0 Bob olduğunu amcam. : D
kedi
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.