&&आदेशों के बीच ऑपरेटर के साथ , प्रत्येक कमांड अनुक्रम में चलता है, और यदि कोई कमांड विफल रहता है (अर्थात एक नॉनज़रो स्थिति देता है), तो बाद के आदेश निष्पादित नहीं किए जाते हैं।
यदि आप कोई बात नहीं रखना चाहते हैं ;, तो इसके बजाय (या एक नई पंक्ति, जो समतुल्य है) का उपयोग करें &&। यहां, आपको एक कमांड निष्पादित करने की आवश्यकता है, और यदि यह सफल होता है, तो कुछ और कमांड निष्पादित करें कि वे सफल होते हैं या नहीं। इसे प्राप्त करने का एक तरीका इन कमांडों को ब्रेस ग्रुप के अंदर रखना है (बस 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। आपने लिखा है: “चुरोट में बाश चलाओ। जब बैश बाहर निकलता है, तो दौड़ें sourceऔर export। " यह शायद आप क्या मतलब नहीं है। रीडिंग /etc/profileबैश को एक लॉगिन शेल बनाकर किया जा सकता है। सेट करने का एक संभावित तरीका PS1बैश चलाने से पहले इसे सेट करना हो सकता है, लेकिन यह काम नहीं करेगा यदि /etc/profileयह ओवरराइड करता है, जो कि आम है। एक बेहतर तरीका यह है PS1कि ~/.bashrc अगर चेरोट के अंदर चल रहा है (तो .bashrc, नहीं.profile )।
chroot . bash --login
डेबियन सेट करने के लिए निम्न कोड का उपयोग करता है 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\$ '
वैकल्पिक रूप से, प्रॉम्प्ट के लिए, इसके बजाय एक पर्यावरण चर का उपयोग करें: चलाएँ
CHROOT_LOCATION=$PWD chroot bash --login
और में रखते ~/.bashrcया /etc/bash.bashrc:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;। बस प्रत्येक कमांड को अपनी लाइन पर रखें, लेकिन आपको भी छुटकारा पाना होगाset -e। यदि आप कमांड विफलता के बारे में परवाह नहीं करते हैं, तो भी उपयोग क्यों करेंset -e? (मैं एक पंक्ति के लिए पूछे गए प्रश्न को जानता हूं, लेकिन यह एक स्क्रिप्ट के भीतर कोई मतलब नहीं है)।