"উত্স এক্স", "এর মধ্যে পার্থক্য কী? x "এবং" ./x "বাশে?


11

আমার নীচে একটি বাশ উত্স আছে run.sh,

#!/bin/bash
if [ $# -ne 1 ]; then
    exit
fi
...

আমি যখন এটি দুটি উপায়ে কার্যকর করি তখন বিভিন্ন আচরণ হয়। প্রথম উপায় হ'ল,

source run.sh

এটি কার্যকর হওয়ার পরে টার্মিনালটি বন্ধ করে দেবে। দ্বিতীয় উপায়টি হ'ল,

./run.sh

এটি কেবল স্ক্রিপ্টটি চালানো শেষ করবে এবং টার্মিনালে থাকবে। আমি জিজ্ঞাসা করছি যে উভয়ের জন্য বাশ স্ক্রিপ্ট থেকে বেরিয়ে যাওয়ার source run.shএবং ./run.shকার্যকর করার জন্য কোনও আদেশ আছে কিনা ? আমিও চেষ্টা করেছি return, যা ./run.shমৃত্যুদণ্ড কার্যকর করার মতো কাজ করে না ।

আরও সাধারণভাবে, আমি কেন আগ্রহী তা নিয়ে আগ্রহী এবং "উত্স" এবং "ব্যবহারের মধ্যে কী পার্থক্য রয়েছে তা আমি আগ্রহী। স্ক্রিপ্ট কার্যকর করার জন্য?

উত্তর:


16

উত্তর দেওয়ার আগে, আমি মনে করি কিছু স্পষ্টতা দরকার। আসুন নিম্নলিখিত তিনটি লাইন বিশ্লেষণ করুন:

source run.sh
. run.sh
./run.sh

প্রথম দুটি লাইন হুবহু একরকম: .আসলে এটির জন্য একটি নাম sourcesourceবর্তমান প্রসঙ্গে শেল স্ক্রিপ্টটি কার্যকর করছে কি , তাই exitশেলটি ছাড়ার জন্য একটি কল করা হবে।

তৃতীয় লাইনের (যা আপনাকে বিভ্রান্ত করে) এর অন্যান্য লাইনের সাথে কিছুই করার নেই। ./run.shকেবল একটি পথ এবং এটি (উদাহরণস্বরূপ) /home/user/run.shবা এর মতো /usr/bin/something। সর্বদা মনে রাখবেন যে শেলের কমান্ডগুলি একটি স্পেস দ্বারা পৃথক করা হয়। সুতরাং, এই ক্ষেত্রে, কমান্ডটি নয় ., তবে এটি হ'ল ./run.sh: এর অর্থ হ'ল একটি উপ-শেলটি কার্যকর হবে এবং exitকেবল সাব-শেলের ক্ষেত্রেই এর প্রভাব পড়বে।


5

তিনটি উপায়:

আপনি কোনও ফাংশনে স্ক্রিপ্টটি আবদ্ধ করতে পারেন এবং কেবলমাত্র রিটার্ন ব্যবহার করতে পারেন।

#!/usr/bin/env bash
main() {
    ...
    return 1
    ...
}
main "$@"

স্ক্রিপ্টটি ইন্টারেক্টিভ শেল দ্বারা উত্সাহিত করা হচ্ছে কিনা তা আপনি পরীক্ষা করতে পারেন।

if [[ $- = *i* ]]; then
    return 1
else
    exit 1
fi

আপনি ফিরে যাওয়ার চেষ্টা করতে পারেন, এবং যদি এটি ব্যর্থ হয় তবে প্রস্থান করুন।

return 1 2>/dev/null || exit 1

যাদু জাগরণ কীভাবে কাজ করে তা সম্পর্কে কোনও ইঙ্গিত $- = *i* ?
ডেডবিফ 404

@ deadbeef404 বিশেষ প্যারামিটারটিতে -বর্তমানে সক্রিয় বিকল্পের পতাকা রয়েছে। -iপতাকাটি সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন । দেখুন gnu.org/software/bash/manual/html_node/Special-Parameters.html
geirha

1

কমান্ডটি 'উত্স' হিসাবে 'অন্তর্ভুক্ত' বিবৃতি হিসাবে ভাবুন। এটি আর্গুমেন্টের বিষয়বস্তু নেয় এবং এটি চালিত করে যেন এটি সরাসরি চালানো হয়েছিল। এক্ষেত্রে আপনার কমান্ডটি 'रन.শ' এর যুক্তিযুক্ত 'উত্স' এবং রান.শ নির্বাহ করা হবে ঠিক যেমন আপনি রানডশ এর সামগ্রীটি আপনার কমান্ড লাইনে টাইপ করেছেন।

আপনি যখন './run.sh' চালান, './run.sh' আপনার আদেশ এবং এটির কোনও যুক্তি নেই। যেহেতু এই ফাইলটি সরল-পাঠ্য এবং বাইনারি নয়, আপনার শেলটি শেবাং (প্রথম লাইনে '#!') তে একটি দোভাষী খুঁজছেন এবং '/ বিন / বাশ' খুঁজে পাবেন। সুতরাং আপনার শেলটি তখন বাশের একটি নতুন উদাহরণ শুরু করবে এবং রান.শ এর সামগ্রীটি এই নতুন উদাহরণের মধ্যে চলে।

প্রথম উদাহরণে, যখন ব্যাশ 'প্রস্থান' কমান্ডে পৌঁছায় এটি ঠিক কার্যকর হয় যেমন আপনি এটি কমান্ড লাইনে টাইপ করেছিলেন। দ্বিতীয় উদাহরণে এটি আপনার শেলটি শুরু হওয়া ব্যাশ প্রক্রিয়াতে কার্যকর করা হয়, সুতরাং কেবলমাত্র বাশের এই উদাহরণটি একটি 'প্রস্থান' কমান্ড পায়।

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


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