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-say
kode 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 $?
)
sudo
perintah berhasil (yaitu, jika sudo
keluar dengan status 0). Tapi, dalam kode Anda, skrip tetap berjalan (tidak keluar) jika sudo
berhasil
command
dan tidak sudo
sama 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 sudo
sebagai bagian dari tes memungkinkan untuk sudo
menekan kembali command
di tempat pertama dan jadi miring tes.
if ! command -p sudo; then exit; fi
yang memiliki hasil yang sama untuk contoh Anda.