Pertanyaan Bagaimana cara memeriksa apakah suatu perintah berhasil?


Apakah ada cara untuk memeriksa apakah ada kesalahan dalam mengeksekusi perintah?

Contoh:

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

Saya sudah mencoba melakukan itu tetapi tampaknya itu tidak berhasil. Saya tidak melakukan itu.


159
2018-03-07 11:40


asal


Lebih suka $ (foo) di atas backticks `foo`, karena Anda dapat menumpuknya, dan lebih mudah membedakannya dari apostrof. - user unknown
BTW, Anda perlu mendefinisikan fungsi (valid) sebelum Anda menyebutnya. - wjandrea


Jawaban:


Nilai kembalian disimpan di $?. 0 menunjukkan keberhasilan, yang lain menunjukkan kesalahan.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Seperti nilai tekstual lainnya, Anda dapat menyimpannya dalam variabel untuk perbandingan di masa mendatang:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Untuk kemungkinan operator pembanding, lihat man test.


238
2018-03-07 12:06



Itu bagus ... bisakah aku menahan kesalahan output ?? !! , karena dalam hal ini saya memiliki 2 kesalahan: kesalahan perintah "teks" ex, file tidak ditemukan dan kesalahan saya "teks" Yang dalam hal ini gagal misalnya - moata_u
@moata_u: Anda dapat menyimpan nilai dalam variabel seperti yang ditunjukkan dalam jawaban saya. - Lekensteyn
@moata_u: Anda harus meletakkan ; sebelum else dan fi: `jika ...; kemudian ...; lain ...; fi - Lekensteyn
Ini adalah sebuah penggunaan yang tidak berguna test. - David Foerster
@Blauhirn [ $? ] (atau dengan kata lain, test $?) tidak berfungsi karena $? mengevaluasi ke angka (0, 1, dll.) yang tidak nol. Lihat dokumen untuk test: "Jika EXPRESSION dihilangkan,‘ test ’akan menghasilkan false. Jika EXPRESSION adalah argumen tunggal,‘ test ’mengembalikan false jika argumennya batal dan sebaliknya." - Lekensteyn


Jika Anda hanya perlu tahu apakah perintah berhasil atau gagal, jangan repot-repot menguji $?, cukup uji perintahnya secara langsung. Misalnya.:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

Dan menugaskan output ke variabel tidak mengubah nilai kembalian (baik, kecuali jika berperilaku berbeda ketika stdout bukan terminal tentu saja).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals menjelaskan if lebih detail.


60
2018-03-08 23:54



Bagaimana jika Anda ingin melakukan sesuatu selain bercabang seperti menyimpan boolean apakah gagal atau tidak menjadi .ini? Maka variabel output Anda tidak melakukan itu, tetapi $? tidak, sehingga Anda salah dalam mengatakan bahwa menguji perintah secara langsung lebih ketat. - Timothy Swan


command && echo OK || echo Failed

19
2017-12-01 21:19



Jika command mengembalikan kesalahan di layar, bagaimana menyembunyikannya? - Sigur
Jika command menulis kesalahan ke stderr, Anda dapat menggunakan formulir command 2> /dev/null && echo OK || echo Failed. Itu 2> /dev/null mengalihkan output stderr ke /dev/null. Namun, beberapa utilitas akan menulis kesalahan ke stdout (meskipun ini adalah praktik yang buruk). Dalam hal ini Anda dapat menghilangkan 2 dari redirection, tetapi Anda akan kehilangan output apa pun dari perintah. Metode pengecekan kesuksesan ini bagus untuk logika terner sederhana, tetapi untuk perilaku yang lebih kompleks, yang terbaik adalah memeriksa $? untuk keberhasilan perintah, atau gunakan if metode blok yang diuraikan dalam jawaban @ geirha. - Bender the Greatest


$? harus berisi status keluar dari perintah sebelumnya, yang seharusnya nol tanpa kesalahan.

Jadi, sesuatu seperti;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

untuk sebagian besar kasus, lebih mudah untuk menggunakan && membangun ke perintah rantai yang perlu bergantung satu sama lain. Begitu cd /nonexistant && echo success! akan tidak gema kesuksesan karena perintah istirahat sebelum &&. Konsekuensi dari ini adalah ||, di mana cd /nonexistant || echo fail  akan echo gagal karena cd gagal. (ini menjadi berguna jika Anda menggunakan sesuatu seperti || keluar, yang akan mengakhiri skrip jika perintah sebelumnya gagal.)


12
2018-03-07 12:04



Itu bagus ... bisakah aku menahan kesalahan output ?? !! , karena dalam hal ini saya memiliki 2 kesalahan: kesalahan perintah "teks" ex, file tidak ditemukan dan kesalahan saya "teks" Yang dalam hal ini gagal misalnya - moata_u
@moata_u, lihat mywiki.wooledge.org/BashFAQ/002 - geirha


command && echo $? || echo $?

4
2017-08-12 16:01





Untuk pemeriksaan kesalahan perintah Anda:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

Terinspirasi dalam pembuatan Lean:


2
2017-12-29 04:20





Perlu dicatat itu if...then...fi dan &&/|| jenis pendekatan berhubungan dengan status keluar yang dikembalikan oleh perintah yang ingin kita uji (0 pada keberhasilan); namun, beberapa perintah tidak mengembalikan status keluar non-nol jika perintah gagal atau tidak dapat menangani masukan. Ini artinya biasa if dan &&/|| pendekatan tidak akan berfungsi untuk perintah-perintah tertentu.

Misalnya, di Linux GNU file masih keluar dengan 0 jika menerima file yang tidak ada sebagai argumen dan find tidak dapat menemukan file yang ditentukan pengguna.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

Dalam kasus semacam itu, satu cara potensial yang dapat kami lakukan untuk mengatasi situasi ini adalah dengan membaca stderr/stdin pesan, mis. mereka yang kembali file perintah, atau parse keluaran dari perintah seperti di find. Untuk tujuan itu, case pernyataan bisa digunakan.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Ini adalah repost dari jawabanku sendiri pertanyaan terkait di unix.stackexchange.com )


0
2017-11-13 18:58





Seperti disebutkan dalam banyak jawaban lainnya, tes sederhana $? akan melakukannya, seperti ini

if [ $? -eq 0 ]; then something; fi

Jika Anda ingin menguji apakah perintah gagal, Anda dapat menggunakan versi yang lebih pendek di bash (tapi mungkin berlebihan) sebagai berikut:

if (($?)); then something; fi

Ini berfungsi dengan menggunakan (( )) mode aritmatika, jadi jika perintah kembali success, i.e. $? = 0 maka tes akan dievaluasi ((0)) yang menguji sebagai false, jika tidak, itu akan kembali true.

Untuk menguji keberhasilan, Anda bisa menggunakan:

if ! (($?)); then something; fi

tapi itu tidak lebih pendek dari contoh pertama.


0
2017-08-16 21:07