একটি ডিরেক্টরিতে সিডি করুন এবং অনেক কমান্ড কার্যকর করুন


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লগইন শেল তৈরি করে করা যায় ing সেট করার একটি সম্ভাব্য উপায় 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? (আমি জানি যে প্রশ্নটি একটি লাইনের জন্য চেয়েছিল, তবে এটি কোনও স্ক্রিপ্টের মধ্যে কোনও অর্থ দেয় না)।
ক্যাম

সম্ভবত এটি কোনও স্ক্রিপ্ট নয় এবং এটি উত্সাহিত করার জন্য বোঝানো হয়েছে (যদিও সে-ব্যাং লাইন থাকা তখন কোনও তাৎপর্যপূর্ণ নয়) কারণ এটি সেটিংস PS1।
স্টাফেন চেজেলাস

0

কমান্ডটি বন্ধনীতে রাখুন - (), যাতে আপনি বর্তমান ডিরেক্টরিতে ফিরে যান, বা সিডি - শেষে। আপনি যদি এটি কোনও ফাইলে রাখেন এবং এটি চালান: sh ./my_script.sh এটি পরিবর্তিত ডিরেক্টরিতে কমান্ডগুলি চালিত করবে।

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

ব্যাশে

set -e 

স্ক্রিপ্টটি প্রথম ব্যর্থতায় চলমান বন্ধ করে দেবে। কারণ আপনি + ই সেট করেছেন আমি ধরে নেব আপনি কোনও কমান্ড ব্যর্থ হলে স্ক্রিপ্টটি চালিয়ে যেতে চান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.