#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
boş değeri yazdırır. Tahmin etmiştim:
1
Neden t1
değişkene çıkış komutunun dönüş değeri atanmıyor - 1
?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
boş değeri yazdırır. Tahmin etmiştim:
1
Neden t1
değişkene çıkış komutunun dönüş değeri atanmıyor - 1
?
Yanıtlar:
local t1=$(exit 1)
kabuğa şunları söyler:
exit 1
bir deniz kabuğu içinde koşmak ;t1
çıktığı gibi) fonksiyona yerel bir değişkende saklar .Bu yüzden t1
boş 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"
}
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Çı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
t1=$?
amacı kullanmak, değil mi? ve $?
atama op tarafından engellenmez mi? printf '%d\n' "${t1}"
Gelen bash
bu 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. local
kendi 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 local
o 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 bash
etmiyor çü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.
Neden sadece if some-command; then echo "Success $?"; else echo "Failure $?"; fi
komutun çı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 be
eğer grep -q 'somestring' somefile; else "çıkış kodu somestring $ olduğunu bulamadınız mı?"; Daha sonra "? Found somestring çıkış kodu $ echo" fi`.
return 3
Son 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') )
.