Saya sedang menulis skrip bash di mana saya ingin keluar jika pengguna tidak root. Kondisional berfungsi dengan baik, tetapi skrip tidak keluar.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Saya sudah mencoba menggunakan &&
bukannya ;
tapi pekerjaan tidak.
bash
shell
shell-script
scripting
Garrett Hall
sumber
sumber
exit 1
untuk memahami proses induk bahwa terjadi masalah.[[
untuk perbandingan angka, gunakan((
.[[
baik-baik saja, asalkan Anda menggunakan-eq
bukan==
.(( EUID )) && ...
Tanda kurung di sekitar perintah itu membuat subkulit . Subshell Anda bergema "Harus root untuk menjalankan skrip" dan kemudian Anda memberi tahu subshell untuk keluar (meskipun sudah, karena tidak ada lagi perintah). Cara termudah untuk memperbaikinya mungkin dengan hanya menggunakan
if
:sumber
id -u == 0
, yang berarti bahwa Anda adalah root. Kamu ingin[[ $(id -u) != 0 ]]; then
.[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
Perhatikan juga$UID
, yang menyimpan proses pemijahan. Saya pikir Anda mungkin lebih suka$EUID
.((UID)) && echo 'You have to be root.' && exit 1
.set -e
dibatalkan. Salah satu solusi untuk masalah itu adalah[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.Dengan bash :
sumber
echo
gagal (misalnya karena stdout tidak dapat ditulisi).Tanda kurung ada
||
dan&&
tidak diperlukan karena ini asosiatif-benar. Dua ekspresi berikut ini setara:Jadi
&&
alih-alih;
akan bekerja dengan baik, karenaecho
akan mengembalikan true.sumber
ini mungkin membantu Anda, dalam bash
sumber