#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
mencetak nilai kosong. Saya mengharapkan:
1
Mengapa t1
variabel tidak mendapatkan nilai pengembalian perintah keluar - 1
?
bash
shell
variable
command-substitution
Gilles 'SANGAT berhenti menjadi jahat'
sumber
sumber
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Kode keluar disimpan dalam $? variabel. Menggunakan Substitusi Perintah hanya menangkap output, Anda harus menggunakan (...) untuk membuat subkulit :
sumber
t1=$?
adalah untuk menggunakannya, bukan? dan tidak akan$?
musnah oleh penugasan op? Saya kira saya bertanya apakah tidak seharusnyaprintf '%d\n' "${t1}"
Dalam
bash
karya ini:Itu ada hubungannya dengan urutan evaluasi perintah dan penugasan variabel.
local
memiliki nilai pengembalian semua miliknya sendiri - dan itu adalah perintah yang sedang dijalankan, bukan pengganti perintah. Alasan hal-hal seperti ...... dapat mengembalikan 1 adalah karena tidak pernah ada pengembalian dalam perintah itu kecuali untuk menjalankan subshell untuk memberikan
$x
nilai - jadi$?
tidak mendapatkan musnah seperti halnya dalam hampir setiap kasus lain di mana penggantian perintah digunakan.Pokoknya, dengan
local
itu tidak mendapatkan musnah - tetapi jika Anda menangkapnya pada waktu yang tepat - yang sementara ekspansi masih sedang dievaluasi dan sebelumlocal
's rutinitas memiliki kesempatan untuk mengkritik itu - Anda masih dapat menetapkan.... mencetak ...
Anda harus tahu bahwa di banyak shell Anda tidak dapat mengandalkan
$?
sedang mengatur evaluasi tengah dengan cara itu. Bahkan, itu mungkin karena cangkang tersebut tidak repot mengevaluasi ulang pada setiap saat yang mungkinbash
terjadi - yang saya berpendapat mungkin perilaku yang lebih baik daripadabash
's. Apakah Anda benar-benar ingin penerjemah Anda mengevaluasi nilai-nilai berulang yang kemungkinan besar akan ditimpa sebelum Anda sempat menggunakannya?Bagaimanapun, itulah bagaimana Anda bisa melakukan itu.
sumber
Tergantung mengapa Anda mencoba untuk hanya mendapatkan kode keluar Anda juga bisa menjalankan
if some-command; then echo "Success $?"; else echo "Failure $?"; fi
yang tidak melakukan apa pun dengan output dari perintah, itu hanya mengevaluasi kode keluar dari perintah yang dijalankan. Anda dapat menambahkanor
(or
$ (around the command and you'll still get the same results. A better example might be
jika grep -q 'somestring' somefile; kemudian echo "Ditemukan kode keluar somestring adalah $?"; Lain "Tidak menemukan kode keluar somestring adalah $?"; Fi`.Anda juga dapat menguji kode pengembalian suatu fungsi yang bisa berupa
return 3
kode pengembalian eksplisit atau tersirat yang merupakan hasil dari perintah terakhir, dalam hal ini Anda harus berhati-hati bahwa Anda tidak memilikiecho
kode di akhir fungsi, jika tidak topeng / me-reset kode keluar sebelumnya.Akhirnya trik kotor karena Anda tidak dapat melakukannya
VAR=(SOME_COMMAND)
karenaVAR=()
merupakan definisi array sehingga Anda perluVAR=( $(echo 'Some value') )
.sumber