menggunakan
time sleep 1
hasil:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
apakah ada perintah yang bisa saya gunakan untuk mencetak kode keluar sleep
atau perintah apa pun yang ingin saya jalankan?
Sesuatu suka:
$ log-exit-code sleep 1
mungkin ini cukup?
sleep 1 && echo "$?"
exit
exit-status
Alexander Mills
sumber
sumber
sleep 1 && echo $?
akan mencetak kode sel tidur hanya ketika itu nol ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Jawaban:
Dalam pengujian saya sejauh ini ini berhasil:
command && echo "$?" || echo "$?"
Katakan saja untuk mengulang kode keluar jika berhasil atau gagal.
Seperti yang ditunjukkan Sato di bawah ini pada dasarnya sama dengan:
command; echo "$?"
Satu hal yang bisa membuat perintah dan / atau berharga adalah sesuatu seperti:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Jika Anda memerlukan skrip Anda untuk bertindak berdasarkan kode keluar seperti yang menjadi perhatian Olivier, itu bukan masalah. Skrip Anda dapat terlihat seperti:
sumber
command; echo $?
?command; echo $?
adalah jawaban yang jauh lebih baik.command ; echo $?
karenaecho $?
selalu berhasil dan karenanya setelah itu, nilai baru $? sekarang 0. Ada cara untuk menyimpan kode pengembalian asli bahkan setelah menampilkannya, jika kode pengembalian asli ini berguna nanti (Misalnya: dalam sebuah skrip, memeriksa kode pengembalian itu penting sebelum memutuskan bagaimana untuk melanjutkan). Lihat jawaban saya untuk satu dari beberapa solusi (sebagian besar jawaban di sini dapat diubah dengan cara yang sama)cmd && echo "$?"
tidak akan bekerja karena hanya akan mencetak angka nol (echo
hanya akan mengeksekusi setelah berhasil menyelesaikan perintah sebelumnya).Inilah fungsi shell pendek untuk Anda:
Ini mencetak kode keluar dari perintah yang diberikan dengan cara yang sama seperti
time
perintah.Dengan mengarahkan ulang
printf
ke/dev/tty
dalam fungsi, kita masih dapat menggunakantellexit
pengalihan tanpa mendapatkan sampah di output standar atau aliran kesalahan:Dengan menyimpan kode keluar dalam suatu variabel, kami dapat mengembalikannya ke pemanggil:
Versi yang lebih bagus dari fungsi yang sama juga mencetak sinyal yang mematikan perintah jika kode keluar lebih besar dari 128 (yang berarti diakhiri karena suatu sinyal):
Pengujian:
(
local
Masalahnya memerlukanash
/pdksh
/bash
/zsh
, atau Anda dapat mengubahnyatypeset
yang beberapa shell lainnya juga mengerti.)sumber
Gunakan fungsi pembungkus shell thingy. Mungkin dengan nama yang berbeda.
(Ini tentu saja akan merusak output standar, jadi gunakan yang
tty
ditunjukkan oleh @Kusalananda atau jangan gunakan di luar konteks interaktif.)Menyingkir ke wilayah yang tidak dapat ditonton, beberapa shell dapat melaporkan status semua perintah dalam sebuah pipa, bukan hanya yang terakhir, misalnya di ZSH jika Anda ingin kegagalan dilaporkan dari seluruh pipa:
TRAPZERR
jika tidak, tidak akan menyala ketika tidak ada kesalahan (pada prinsip "tidak ada berita adalah kabar baik").sumber
GNU
time
memiliki opsi untuk ini:Melewati kode keluar 1 , kecuali dibunuh oleh sinyal 2 :
Jika Anda ingin mengetahui / menangani situasi signal kill, berikan
-v
dan ambil stderr untuk stringCommand terminated by signal
.1 Terima kasih kepada Olivier Dulac karena mencatat kode keluar melewati.
2 Juga, terima kasih Stéphane Chazelas karena menunjukkan kode keluar sinyal mati tidak melewati.
sumber
0
meskipun jika perintah itu terbunuh.256+signum
atau384+signum
atau bahkansignum/256
atausignum/256+0.5
jika suatu inti dihasilkan (sebenarnya status dikembalikan olehwaitpid()
dibagi 256). Beberapa akan memberikan representasi tekstual (sukasigint
atausigquit+core
). Masih mungkin layak dibahas di newsgroup gnu.coreutils.bugs saya setuju.time
bukan bagian daricoreutils
, itu adalah paket dengan daftar mailing bug sendiri ([email protected]))system()
dari awks tradisional seperti yang masih dipertahankan oleh Brian Kernighan (yangk
diawk
) ataunawk
dari Solaris, yangawk
dari FreeBSD yang berasal dari itu.awk 'BEGIN{print system("kill -s ABRT $$")}'
output0.523438
ketika ukuran dump inti tidak terbatas. Perilakugawk
telah berubah baru-baru ini, dengan perilaku yang berbeda-beda dengan--traditional
atau--posix
(lihat juga nilai pengembalianclose(cmd)
untuk variasi yang lebih banyak)Saya tidak menyukai semua jawaban lain (walaupun saya sangat suka kepintarannya): mereka menampilkan kode keluar tetapi mereka juga MENGUBAHNYA. (bagian yang ditampilkan adalah benar, maka setelah itu kembalinya adalah 0)
Ini adalah versi yang dimodifikasi:
sumber
time
yang tidak selalu tersedia.Agar sedikit lebih kuat, kirim status keluar ke FD terpisah sehingga dapat ditangani secara independen dari stdout / stderr:
Catatan Anda harus melakukan sesuatu dengan FD3 atau akan mengatakan
Bad file descriptor
.Ini dapat dikonfigurasi lebih lanjut untuk memberikan output ini ke input dari program lain dengan meminta program lain mendengarkan lebih dari satu FD; Anda bisa menggunakan ini sebagai semacam awal 90-an Kibana :)
sumber
Sementara semua jawaban (sangat menarik) lainnya menjawab pertanyaan persis yang diajukan OP, dalam praktiknya, hal-hal biasanya lebih sederhana. Anda cukup menyimpan status keluar ke variabel (segera mengikuti perintah) dan melaporkan atau mencatatnya dengan cara apa pun yang Anda inginkan. Misalnya mencetak ke / dev / stderr atau menulis / menambahkannya sebagai pesan teks ke dalam file log. Dan, itu juga dipertahankan untuk digunakan dalam pengambilan keputusan / kontrol aliran dalam kode selanjutnya.
Jika dalam suatu fungsi:
Jika langsung di skrip:
(Menunduk dan menutupi karena ini tidak menjawab pertanyaan yang tepat .)
sumber