#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echoboş değeri yazdırır. Tahmin etmiştim:
1
Neden t1değişkene çıkış komutunun dönüş değeri atanmıyor - 1?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echoboş değeri yazdırır. Tahmin etmiştim:
1
Neden t1değişkene çıkış komutunun dönüş değeri atanmıyor - 1?
Yanıtlar:
local t1=$(exit 1) kabuğa şunları söyler:
exit 1bir deniz kabuğu içinde koşmak ;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"
}
$(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 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.
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') ).