ด้วย&&โอเปอเรเตอร์ระหว่างคำสั่งแต่ละคำสั่งจะทำงานตามลำดับและหากคำสั่งใดล้มเหลว (เช่นส่งคืนสถานะที่ไม่ใช่ศูนย์) คำสั่งที่ตามมาจะไม่ถูกดำเนินการ
หากคุณต้องการที่จะเก็บไปไม่ว่าสิ่งที่ใช้;(หรือขึ้นบรรทัดใหม่ซึ่งเทียบเท่า) &&แทน ที่นี่คุณต้องดำเนินการหนึ่งคำสั่งและหากสำเร็จให้ดำเนินการคำสั่งเพิ่มเติมไม่ว่าจะสำเร็จหรือไม่ วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการวางคำสั่งเหล่านี้ไว้ในกลุ่มวงเล็บปีกกา (เพียงแค่cd … && mount1; mount2ไม่ทำงานเพราะสิ่งนี้จะเรียกใช้งานmount2ว่าcdสำเร็จหรือไม่เนื่องจากมีความสำคัญกว่า)
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
หรือออกจากสคริปต์หรือกลับจากฟังก์ชันหากcdล้มเหลว
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
หรือเรียกใช้ภายใต้set -eและวาง|| true(“ หรือดำเนินต่อไป”) หลังจากคำสั่งที่อาจล้มเหลว
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
อีกทางหนึ่งเขียนคำสั่งที่ต้องประสบความสำเร็จ: ทดสอบว่า/procติดตั้งเรียบร้อยแล้วเป็นต้น
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
chrootคุณมีปัญหาที่คุณโทรอีก คุณได้เขียน:“ ใช้ bash ใน chroot เมื่อ bash ออกให้รันsourceและexport” นั่นอาจไม่ใช่สิ่งที่คุณหมายถึง การอ่าน/etc/profileสามารถทำได้โดยการทุบตีเปลือกเข้าสู่ระบบ วิธีที่เป็นไปได้ในการตั้งค่าPS1อาจเป็นการตั้งค่าก่อนที่จะรัน bash แต่วิธีนี้จะไม่ทำงานหาก/etc/profileแทนที่มันซึ่งเป็นเรื่องปกติ วิธีที่ดีกว่าคือการตั้งค่าPS1ใน~/.bashrc ถ้าทำงานภายใน chroot ( .bashrcไม่.profile )
chroot . bash --login
Debian ใช้รหัสต่อไปนี้ชุดPS1ใน/etc/bash.bashrcขึ้นอยู่กับเนื้อหาของ/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\$ '
อีกทางหนึ่งสำหรับพร้อมต์ให้ใช้ตัวแปรสภาพแวดล้อมแทน: run
CHROOT_LOCATION=$PWD chroot bash --login
และใส่สิ่งนี้ใน~/.bashrcหรือ/etc/bash.bashrc:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;คุณไม่จำเป็นต้องแม้กระทั่งการใช้งาน เพียงแค่ใส่แต่ละคำสั่งในบรรทัดของตัวเองset -eแต่คุณยังต้องได้รับการกำจัด หากคุณไม่สนใจเกี่ยวกับความล้มเหลวของคำสั่งทำไมยังใช้set -e? (ฉันรู้ว่าคำถามถามหนึ่งบรรทัด แต่มันก็ไม่สมเหตุสมผลในสคริปต์)