Với &&
toán tử giữa các lệnh, mỗi lệnh chạy theo trình tự và nếu bất kỳ lệnh nào bị lỗi (tức là trả về trạng thái khác không), các lệnh tiếp theo sẽ không được thực thi.
Nếu bạn muốn tiếp tục đi bất kể điều gì, hãy sử dụng ;
(hoặc một dòng mới, tương đương) thay vì &&
. Tại đây, bạn cần thực thi một lệnh và nếu nó thành công, hãy thực thi thêm một số lệnh cho dù chúng có thành công hay không. Một cách để đạt được điều này là đặt các lệnh này trong một nhóm niềng răng (chỉ cd … && mount1; mount2
không hoạt động vì điều này thực thi mount2
dù cd
thành công hay không do ưu tiên).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Hoặc, thoát khỏi tập lệnh hoặc trả về từ chức năng nếu cd
thất bại.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Ngoài ra, hãy chạy bên dưới set -e
và đặt || true
(Tuy nhiên hoặc tiếp tục đi bằng cách nào đó) sau khi các lệnh có thể thất bại.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Ngoài ra, viết một lệnh phải thành công: kiểm tra nếu /proc
và như vậy đã được gắn kết.
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
Bạn có một vấn đề khác mà bạn gọi chroot
. Bạn đã viết: Quảng cáo chạy bash trong chroot. Khi bash thoát, chạy source
và export
. Đó có lẽ không phải là ý bạn. Đọc /etc/profile
có thể được thực hiện bằng cách làm cho bash một vỏ đăng nhập. Một cách có thể để thiết lập PS1
có thể là đặt nó trước khi chạy bash, nhưng nó sẽ không hoạt động nếu /etc/profile
ghi đè lên nó, điều này là phổ biến. Cách tốt hơn là để thiết lập PS1
trong ~/.bashrc
nếu chạy bên trong một chroot ( .bashrc
không.profile
).
chroot . bash --login
Debian sử dụng đoạn mã sau để thiết lập PS1
trong /etc/bash.bashrc
dựa trên nội dung của /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\$ '
Ngoài ra, để nhắc, sử dụng biến môi trường thay thế: chạy
CHROOT_LOCATION=$PWD chroot bash --login
và đặt cái này vào ~/.bashrc
hoặc /etc/bash.bashrc
:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;
. Chỉ cần đặt mỗi lệnh trên dòng riêng của nó, nhưng bạn cũng phải thoát khỏiset -e
. Nếu bạn không quan tâm đến lỗi lệnh, tại sao thậm chí sử dụngset -e
? (Tôi biết câu hỏi yêu cầu một dòng, nhưng điều đó không có ý nghĩa trong một kịch bản).