एक निर्देशिका के लिए सीडी और कई आदेशों पर अमल


10

मेरे पास स्क्रिप्ट है।

#!/bin/bash
mount /dev/sda6 /mnt/gentoo
set +e
cd /mnt/gentoo && mount -t proc none /mnt/gentoo/proc \
 && mount --rbind /dev /mnt/gentoo/dev \
 && mount --rbind /sys /mnt/gentoo/sys \
 && chroot /mnt/gentoo /bin/bash \
 && source /etc/profile  \
 && export PS1="(chroot)$PS1" 

जो मैं यहां पूरा करने की कोशिश कर रहा हूं वह एक निर्देशिका में बदलना /mnt/gentooऔर कुछ कमांड निष्पादित करना है। यह ठीक पहली बार काम करता है जब कोई भी रास्ता नहीं था। लेकिन अगर मैं इसे चलाने के बाद माउंट कर रहा हूं तो कुछ रास्तों पर सफलतापूर्वक प्रदर्शन किया गया है, यह जारी नहीं है और पहली विफलता पर रुक जाता है। मैं चाहता हूं कि सभी कमांड निष्पादित हो जाएं, भले ही माउंट 'पहले से माउंटेड' त्रुटि के कारण विफल हो रहा हो। मैं यह कैसे कर सकता हूँ?

इन सभी कमांडों को एक लाइन में एक साथ मिलाने से बेहतर तरीका क्या है?

जवाबों:


8

&&आदेशों के बीच ऑपरेटर के साथ , प्रत्येक कमांड अनुक्रम में चलता है, और यदि कोई कमांड विफल रहता है (अर्थात एक नॉनज़रो स्थिति देता है), तो बाद के आदेश निष्पादित नहीं किए जाते हैं।

यदि आप कोई बात नहीं रखना चाहते हैं ;, तो इसके बजाय (या एक नई पंक्ति, जो समतुल्य है) का उपयोग करें &&। यहां, आपको एक कमांड निष्पादित करने की आवश्यकता है, और यदि यह सफल होता है, तो कुछ और कमांड निष्पादित करें कि वे सफल होते हैं या नहीं। इसे प्राप्त करने का एक तरीका इन कमांडों को ब्रेस ग्रुप के अंदर रखना है (बस 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

6

&&इस मामले में विभाजक कह रहा है 'केवल तभी पिछले आदेश सफल रहा था जारी रखने के लिए'। यदि आप ;इसके बजाय उपयोग करते हैं, तो आदेश परिणामों के बावजूद अनुक्रम को निष्पादित करेगा।

ध्यान दें कि अगर यह एक क्रॉन जॉब है या कुछ और संवेदनशील है जो स्टेंडर को लिखा जा रहा है, तो आपको त्रुटियों को पुनर्निर्देशित करना होगा /dev/null


आपको उपयोग करने की भी आवश्यकता नहीं है ;। बस प्रत्येक कमांड को अपनी लाइन पर रखें, लेकिन आपको भी छुटकारा पाना होगा set -e। यदि आप कमांड विफलता के बारे में परवाह नहीं करते हैं, तो भी उपयोग क्यों करें set -e? (मैं एक पंक्ति के लिए पूछे गए प्रश्न को जानता हूं, लेकिन यह एक स्क्रिप्ट के भीतर कोई मतलब नहीं है)।
कैम

मुमकिन है, यह एक स्क्रिप्ट नहीं है और इसका मतलब खट्टा होना है (हालांकि उसके पास एक धमाकेदार लाइन होने का कोई मतलब नहीं है) क्योंकि यह सेटिंग्स 1 है।
स्टीफन चेजलस

0

कमांड को कोष्ठक में रखें - (), ताकि आप वर्तमान निर्देशिका में लौटें, या अंत में सीडी -। यदि आप इसे किसी फ़ाइल में रखते हैं और इसे चलाते हैं: sh ./my_script.sh यह निर्देशिका में परिवर्तित कमांड को चलाएगा।

cd  /mnt/gentoo
mount -t proc none /mnt/gentoo/proc
...
cd - 

मारपीट में

set -e 

पहली विफलता पर स्क्रिप्ट को रोकने का कारण होगा। क्योंकि आपने + e सेट कर दिया है, मुझे लगता है कि आप चाहते थे कि स्क्रिप्ट चलती रहे अगर कोई कमांड विफल रहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.