`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.