অন্য স্ক্রিপ্টের জন্য একটি স্ক্রিপ্ট কল করুন, তবে সন্তানের প্রস্থানটি কল করলে পিতামাতাকে প্রস্থান করবেন না


11

first.sh:

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

যদি second.shকোনও ত্রুটি সনাক্ত করে এবং স্ট্যাটাস -9 সহ first.shপ্রস্থান করে, সর্বদা প্রস্থান করে। শিশু শেলটি যদি প্রস্থান হয় তবে আমি কীভাবে প্রথম শেলটি থেকে বেরিয়ে এড়াতে পারি?

আমি সম্পাদনা করতে পারবেন না second.sh


এখানে আপনি .কমান্ডটি ব্যবহার করছেন যা বর্তমান শেলটিতে অন্য একটি ফাইল উত্স করে। এতে কোনও শিশু শেল বা সাবস্কেল জড়িত নেই। আপনি চাওয়ার কথা বলছেন কি চালানো second.sh এবং third.shতাদের গুন পরিবর্তে?
সেলেদা

হ্যাঁ .. আমি পরিবর্তে সম্পাদন লিখতে হবে। ./? আমি "প্রস্থান $" উপেক্ষা করতে চাই? সেকেন্ড.শ .. এর ভিতরে সেকেন্ড.শ সম্পাদনা করা সম্ভব?
ব্যবহারকারী 3589887

উত্তর:


13

সহ হয় তুমি এখানে কি করছ second.shএবং third.shউপ-স্ক্রিপ্ট হিসাবে একই প্রক্রিয়া, যা শেল প্রোগ্রামিং বলা হয় "গুন" চলমান। . ./second.shমূলত second.shএটি সময়ে পাঠ্য অন্তর্ভুক্ত সমতুল্য । exitকমান্ড প্রক্রিয়া থেকে প্রস্থান, এটা ব্যাপার কিনা আপনি মূল লিপিতে বা সোর্সড লিপিতে সেটিতে কল না।

যদি আপনি যা করতে চান তার মধ্যে যদি কমান্ডগুলি চালিত হয় second.shএবং third.shএবং তাদের মূল স্ক্রিপ্ট থেকে ভেরিয়েবল এবং ফাংশনগুলি অ্যাক্সেস বা পরিবর্তন করতে হবে না, এই স্ক্রিপ্টগুলিকে শিশু প্রক্রিয়া হিসাবে কল করুন।

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

মূল স্ক্রিপ্ট থেকে ভেরিয়েবল এবং ফাংশন অ্যাক্সেস করার জন্য আপনার যদি অন্য স্ক্রিপ্টগুলির প্রয়োজন হয় তবে সেগুলি সংশোধন না করে তবে সাবস্কেলগুলিতে এই স্ক্রিপ্টগুলিকে কল করুন। সাবশেলগুলি পৃথক প্রক্রিয়া, সুতরাং exitকেবলমাত্র সেগুলি থেকে বেরিয়ে আসে।

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"

যদি আপনাকে প্যারেন্ট স্ক্রিপ্টে second.shএবং এর third.shমধ্যে সংজ্ঞায়িত ভেরিয়েবল বা ফাংশন ব্যবহার করতে হয় তবে আপনাকে সেগুলি স্রোসিং করে রাখা দরকার।

returnবিল্টিনটি কেবল উত্সযুক্ত স্ক্রিপ্ট থেকে বেরিয়ে আসে পুরো প্রক্রিয়াটি নয় - এটি .কমান্ডের সাথে অন্য স্ক্রিপ্টকে অন্তর্ভুক্ত করা এবং মূল স্ক্রিপ্টে এর পাঠ্য সহ অন্তর্ভুক্ত কয়েকটি পার্থক্য । যদি exitউত্সযুক্ত স্ক্রিপ্টগুলি কেবলমাত্র শীর্ষ স্তরে কল করে, অভ্যন্তরীণ ক্রিয়াগুলির বিপরীতে, তবে আপনি এতে exitরূপান্তর করতে পারেন return। কোনও স্ক্রিপ্ট পরিবর্তন না করে আপনি কোনও উপাধ ব্যবহার করে এটি করতে পারেন।

#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"

যদি exitভিতরে ফাংশনগুলিও বলা হয়, তবে আমি মনে করি না যে এটি একটি জটিল নয়। একটি জটিল উপায় হ'ল একটি প্রস্থান ফাঁদ সেট করা এবং আপনার কোডটি সেখানে রাখা।

#!/bin/ksh
do_first () {
  echo "prova"
  trap "after_second" EXIT
  . ./second.sh
  after_second
}
after_second () {
  echo "ho lanciato il secondo"
  trap "after_third" EXIT
  . ./third.sh
  after_third
}
after_third () {
  trap - EXIT
  echo "ho lanciato il terzo"
}
do_first

এই কারণেই আমি '' ব্যবহার বন্ধ করে দিয়েছি। স্ক্রিপ্টে ফাইলগুলি উত্স করতে এবং পরিবর্তে 'উত্স' ব্যবহারের চেষ্টা করুন। আইএমও যা বাশকে 'সেরা অনুশীলন' হিসাবে বিবেচনা করা উচিত, যেহেতু এটি আপনার কোড কী করছে তা এটি আরও স্পষ্ট করে তোলে।
মার্ক ই। হ্যামিল্টন

6

দ্বিতীয় এবং তৃতীয় শেলটি স্যুরসিংয়ের পরিবর্তে এগুলি চালান যা আপনি অন্য কোনও আদেশ হিসাবে করেন। প্রস্থান কোডটি আপনার প্রয়োজন মতো সংরক্ষণ করা এবং ব্যবহার করা যেতে পারে:

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...

STATUS1=$?পূর্বে জারি প্রতিধ্বনি কমান্ড, যার ফলাফল স্বাধীন ফল ফেলবো ./second.sh
ক্রোম্যাক্স

@ ক্রোম্যাক্স আপনি পুরোপুরি ঠিক আছেন। উত্তর সম্পাদনা করা হয়েছে।
ডেল অ্যান্ডারসন

0

এটি এইভাবে চেষ্টা করুন ( .কল করার আগে প্রথমে সরিয়ে দিন second.sh):

first.sh:

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

এ কারণে যে .জন্য সর্টকোড sourceযা দ্বিতীয় স্ক্রিপ্ট প্রথম এক একটি অংশ হিসাবে অন্তর্ভুক্ত করা কারণ।

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