Dengan &&operator di antara perintah, setiap perintah berjalan secara berurutan, dan jika ada perintah gagal (yaitu mengembalikan status bukan nol), perintah selanjutnya tidak dijalankan.
Jika Anda ingin terus berjalan apa pun, gunakan ;(atau baris baru, yang setara) &&. Di sini, Anda perlu menjalankan satu perintah, dan jika berhasil, jalankan beberapa perintah lagi apakah mereka berhasil atau tidak. Salah satu cara untuk mencapai ini adalah dengan menempatkan perintah-perintah ini di dalam kelompok penyangga ( cd … && mount1; mount2tidak akan berfungsi karena ini dijalankan mount2apakah cdberhasil atau tidak karena didahulukan).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Atau, keluar dari skrip atau kembali dari fungsi jika cdgagal.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Atau, jalankan di bawah set -e, dan masukkan || true("atau tetap pergi") setelah perintah yang mungkin gagal.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Atau, tulis perintah yang harus berhasil: tes jika /procdan seterusnya sudah terpasang.
mount_if_needed () {
eval "mount_point=${\$#}"
awk -v target="$mount_point" '$2 == target {exit(0)} END {exit(1)}' </proc/mounts ||
mount "$@"
}
set -e
cd /mnt/gentoo
mount_if_needed -t proc none /mnt/gentoo/proc
Anda memiliki masalah lain di mana Anda menelepon chroot. Anda telah menulis: “jalankan bash di chroot. Saat bash keluar, jalankan sourcedan export. " Mungkin itu bukan yang Anda maksudkan. Membaca /etc/profiledapat dilakukan dengan membuat bash shell login. Cara yang mungkin untuk ditetapkan PS1adalah mengaturnya sebelum menjalankan bash, tetapi itu tidak akan berhasil jika /etc/profilemenimpanya, yang merupakan hal biasa. Cara yang lebih baik adalah untuk set PS1di ~/.bashrc jika berjalan di dalam chroot ( .bashrc, bukan.profile ).
chroot . bash --login
Debian menggunakan kode berikut untuk set PS1di /etc/bash.bashrcberdasarkan isi /etc/debian_chroot:
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Atau, untuk prompt, gunakan variabel lingkungan sebagai gantinya: jalankan
CHROOT_LOCATION=$PWD chroot bash --login
dan letakkan ini di ~/.bashrcatau /etc/bash.bashrc:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;. Hanya menempatkan setiap perintah pada barisnya sendiri, tetapi Anda juga harus menyingkirkanset -e. Jika Anda tidak peduli dengan kegagalan perintah, mengapa menggunakanset -e? (Saya tahu pertanyaan yang diajukan untuk satu baris, tetapi itu tidak masuk akal dalam naskah).