Apakah mungkin untuk menjaga status keluar perintah terakhir ( $?) tidak berubah setelah pengujian?
Misalnya, saya ingin melakukan:
command -p sudo ...
[ $? -ne 1 ] && exit $?
Yang terakhir exit $?harus mengembalikan status keluar sudo, tetapi sebaliknya ia selalu mengembalikan 0(kode keluar dari tes).
Apakah mungkin untuk melakukan itu tanpa variabel sementara?
Contoh lain untuk memperjelas lebih lanjut:
spd-say "$@"
[ $? -ne 127 ] && exit $?
Dalam hal ini saya ingin keluar hanya jika perintah pertama ditemukan (kode keluar! = 127). Dan saya ingin keluar dengan spd-saykode keluar yang sebenarnya (mungkin tidak
0).
EDIT: Saya lupa menyebutkan bahwa saya lebih suka solusi pengaduan POSIX untuk portabilitas yang lebih baik.
Saya menggunakan konstruksi ini dalam skrip di mana saya ingin memberikan alternatif untuk perintah yang sama. Misalnya, lihat skrip crc32 saya .
Masalah dengan variabel sementara adalah mereka bisa membayangi variabel lain, dan untuk menghindari itu Anda harus menggunakan nama panjang, yang tidak baik untuk keterbacaan kode.
[ $? -ne 127 ] && exit $?)
sudoperintah berhasil (yaitu, jika sudokeluar dengan status 0). Tapi, dalam kode Anda, skrip tetap berjalan (tidak keluar) jika sudoberhasil
commanddan tidak sudosama sekali. Itulah yang dimaksud dengan saya ingin keluar hanya jika perintah pertama ditemukan (kode keluar! = 127) dan merupakan pengembalian yang ditentukancommand ketika perintah yang diminta tidak ditemukan. Saya kira masalahnya adalah bahwa memohon sudosebagai bagian dari tes memungkinkan untuk sudomenekan kembali commanddi tempat pertama dan jadi miring tes.
if ! command -p sudo; then exit; fiyang memiliki hasil yang sama untuk contoh Anda.