Kabuk yerel değişkenine çıkış kodu atama


Yanıtlar:


59

local t1=$(exit 1) kabuğa şunları söyler:

  • exit 1bir deniz kabuğu içinde koşmak ;
  • çıktısını (çıktısı aldığı metni, standart çıktısına t1çıktığı gibi) fonksiyona yerel bir değişkende saklar .

Bu yüzden t1boş olması normaldir .

( komut değiştirme$() olarak bilinir .)

Çıkış kodu her zaman atanır $?, böylece

function0()
{
  (exit 1)
  echo "$?"
}

Aradığınız efekti elde etmek için. Elbette $?başka bir değişkene atayabilirsiniz :

function0()
{
  (exit 1)
  local t1=$?
  echo "$t1"
}

1
Bilirsin, dönüşü her zaman borunun içine de koyabilirsin. `$ (tuzak 'printf ':: ERRNO: $?'' 0; # şimdi ancak ne gerekiyorsa - Yazılı son dize sağlayacağına duyduğu tuzak bütün ikame bağlam için son geri dönüştür.
mikeserv

1
@mikeserv bir backtick özledin mi? $(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Doktor J

13

Çıkış kodu $ olarak mı depolandı ? değişken. Komut Substitution komutunu kullanarak sadece çıktıyı yakalayın, subshell oluşturmak için (...) kullanmanız gerekir :

#!/bin/bash

func() {
  (exit 1)
  local t1=$?
  printf '%d\n' "$t1"
}

func

ödevin t1=$?amacı kullanmak, değil mi? ve $?atama op tarafından engellenmez mi? printf '%d\n' "${t1}"
Olmamalı

@Dani_l: Teşekkürler, bu bir yazım hatası. Güncellenmiş.
cuonglm

Komut Değiştirme'nin yalnızca farklı şekilde yönlendirilmediği sürece standart olarak alındığını unutmayın.
phyatt

7

Gelen bashbu eserlerin:

loc(){  local   "x=$(exit "$1"):$?"
        printf  '$%s:\t%d\n' \
                 x "${x##*:}" \? "$?"
}

Komut değerlendirme sırası ve değişken atama ile ilgisi var. localkendi başına bir dönüş değerine sahiptir - ve komut değiştirme yerine şu anda yürütülen komuttur Bunun gibi şeylerin nedeni ...

x=$(exit 1); echo "$?"

... '' return '' ifadesi, $x'' sub 1 '' in değerini atadığı alt kabuk çalışması haricinde, bu komutta asla bir geri dönüş olmadığından, bu nedenle $?komut değiştirme işlemlerinin kullanıldığı her durumda pratikte olduğu gibi clobbered olmaz.

Neyse, olan localo mu clobbered olsun - açılımları hala değerlendirilmektedir ve süre olduğunu - ancak sadece doğru zamanda yakalamak eğer daha önce local yine atayabilirsiniz - 'in rutinleri Çok eğlenebiliriz için bir şans var.

unset x; loc 130; echo "${x-\$x is unset}"

... baskılar ...

$x: 130
$?: 0
$x is unset

Bilmelisin ki, birçok mermide $?, bu şekilde değerlendirmenin ortalamasına konmaya güvenemezsiniz . Aslında, bu muhtemelen bu kabukları, olası her kavşakta yeniden değerlendirmeyi zahmet bashetmiyor çünkü belki de olduğu gibi - ki iddia edeceğim, muhtemelen olduğundan daha iyi bir davranış olduğunu iddia ediyorum bash. Tercümanınızın, tekrar kullanmaya başlamadan önce üzerine yazılması muhtemel olan özyinelemeli döngü değerlendirme değerlerini gerçekten istiyor musunuz?

Neyse, böyle yapabilirsin.


-1

Neden sadece if some-command; then echo "Success $?"; else echo "Failure $?"; fikomutun çıktısıyla bir şey yapmayan sadece çalıştırabileceğiniz çıkış kodunu almaya çalıştığınıza bağlı olarak , sadece komut çalıştırmasının çıkış kodunu değerlendirir. Ekleyebilir or( or($ around the command and you'll still get the same results. A better example might beeğer grep -q 'somestring' somefile; else "çıkış kodu somestring $ olduğunu bulamadınız mı?"; Daha sonra "? Found somestring çıkış kodu $ echo" fi`.

return 3Son komutun sonucu olan açık ya da dolaylı bir dönüş kodu olabilecek bir fonksiyonun dönüş kodunu da test edebilirsiniz , bu durumda echo, sonunda bir sonuç almadığınıza dikkat etmeniz gerekir işlev, aksi takdirde önceki çıkış kodunu maskeler / sıfırlar.

command_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
}
command_last; echo $?
# Outputs:
# True is 0
# False is 1
# 1

echo_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
  # echo'ing literally anything (or nothing) returns true aka exit 0
  echo
}
echo_last; echo $?
# Outputs:
# True is 0
# False is 1
#            # Blank line due to empty echo
# 0

Son olarak yapamayacağı çünkü kirli bir hüner VAR=(SOME_COMMAND)çünkü VAR=()sen gerekir böylece bir dizi tanımıdır VAR=( $(echo 'Some value') ).


Talep edilen çıktıların tümü, komut yerine koyma işleminin sorunun asıl amacı olan çıkış kodunu vermemesi nedeniyle yanlıştır. "Kirli numara" nın bir şeyle ne alakası olduğu belli değil.
Nick Matteo,
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.