কমান্ড ব্যর্থতা অটো রিটার্ন `উত্স` ডি স্ক্রিপ্ট


2

আমি কিভাবে একটি করা source ডি স্ক্রিপ্ট স্বয়ংক্রিয়-রিটার্ন যদি এটির মধ্যে কোন কমান্ড ব্যর্থ হয়?

ধরুন আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা ব্যর্থতার মাধ্যমে স্বয়ংক্রিয়-এক্সাইট করে set -e, যেমন

#!/bin/bash
# foo.env
set -e        # auto-exit on any command failure
echo "hi"
grep 123 456  # this command will fail (I don't have a file named "456")
echo "should not reach here"

যদি আমি সাধারণত কমান্ডটি চালাই, এটি ব্যর্থ হয়ে স্বয়ংক্রিয়-প্রস্থান করবে grep কমান্ড প্রয়োগ করুন:

box1% ./foo.env
hi
grep: 456: No such file or directory

যাইহোক, যদি আমি source স্ক্রিপ্ট, এটি আমার বর্তমান শেল থেকে বেরিয়ে আসে, শুধু স্ক্রিপ্টটিকে সোর্স করা হয় না:

box1% ssh box2
box2% source ./foo.env
hi
grep: 456: No such file or directory
Connection to box2 closed.
box1%

যদি আমি মুছে ফেলা set -e,

#!/bin/bash
# foo2.env
echo "hi"
grep 123 456  # this command will fail (I don't have a file named "456")
echo "should not reach here"

তাহলে এটি স্বয়ং-প্রস্থান বা স্বয়ংক্রিয়-ফেরত দেয় না source ডি স্ক্রিপ্ট এ সব:

box1% ssh box2
box2% source ./foo2.env
hi
grep: 456: No such file or directory
should not reach here
box2%

আমি এখনো পর্যন্ত পাওয়া একমাত্র workaround একটি যোগ করা হয় return স্ক্রিপ্ট কোড প্রতিটি লাইন অভিব্যক্তি, যেমন।

box1% cat foo3.env
#!/bin/bash
# foo3.env - works, but is cumbersome
echo "hi" || return
grep 123 456 || return
echo "should not reach here" || return

box1% source foo3.env
hi
grep: 456: No such file or directory
box1%

জন্য অন্য উপায় আছে source ডি স্ক্রিপ্ট, কিভাবে অনুরূপ set -e অ- source ডি বেশী?

উত্তর:


1

যখন তুমি source একটি স্ক্রিপ্ট যদি আপনি কীবোর্ড থেকে লাইন দ্বারা যে ফাইল লাইন লেখা ছিল। এটা যে মানে set -e বর্তমান শেলটি বিবেচনা করবে এবং যে ত্রুটিটি বর্তমান শেল থেকে প্রস্থান করবে।

যে একটি workaround। আজ আমি নিজেকে অলস মনে করি তাই আমি মনে করি কম্পিউটার লিখতে পারে ||return আমার জন্য, অথবা ফাইল লাইন দ্বারা লাইন পড়তে এবং ভালো চালানো:

#!/bin/bash
# this is the file MySource.sh
while IFS='' read -r line
do
   [[ $line == \#* ]] || $line || return
done < "$1"

সঙ্গে এটি চালানো . MySource.sh FileToBeSourced.sh

যদি তোমার FileToBeSourced.sh স্ক্রিপ্ট এটি কাজ করা উচিত এক লাইন কমান্ড সঙ্গে।
একটি উত্পাদন পরিবেশে ব্যবহার করার জন্য প্রস্তুত হতে অনেক দূরে।
এটা এবং শেষ পর্যন্ত পরীক্ষা নিজ ঝুঁকিতে এটি ব্যবহার করুন

এটা শুরু যে লাইন skips # কারণ তারা ত্রুটি হতে হবে # command not found


এটি একটি চতুর কৌশল। এটা আমার স্ক্রিপ্ট অনেক লাইন span আউট, তাই আমি একটি fancier পার্সার করতে হবে। সম্ভবত সেরা উপায় একটি পার্সার খুঁজে বা পার্ল মধ্যে এক আপ হ্যাক এবং পরিবর্তে এটি প্রবাহ কমান্ড আছে read
Mr Fooz

@ ম্রফুজঃ ধন্যবাদ, এটি কেবল একটি ধারণা ছিল। সঙ্গে একটি অভিনব পার্সার আপনি ungraceful পরিত্রাণ পেতে পারেন [[ $line == \#* ]] || খুব। হয়তো আপনি করতে পারেন পার্স আউটপুট লুপ শেষে do.. done <<< $( FancyParser.sh "$1" )
Hastur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.