বাশ: একটি স্ক্রিপ্টে বনাম উত্স নির্বাহ সনাক্ত করুন?


19

আমার একটি ফাইল স্ক্রিপ্ট রয়েছে যা আমার ফাইল সিস্টেমের চারপাশে আবদ্ধ (একটি বিল্ড প্রক্রিয়াটির পার্শ্ব প্রতিক্রিয়া) যা কিছু বিশ্বব্যাপী পরিবেশের ভেরিয়েবল (এলডি_লিবিআরএইপ্যাথ, পাঠ, রুটডিআইআর ইত্যাদি) সেট করে যা সঠিক ক্রিয়াকলাপের জন্য আমার শেলটিতে থাকা দরকার। অবশ্যই, এর অর্থ আমার এটি করা source script.shবা . script.shএটি কাজ করা দরকার, এবং না ./script.sh(যা একটি নতুন শেল তৈরি করবে এবং আমার বর্তমান শেলটিতে ভেরিয়েবল সেট করবে না)।

কিছু আমি স্ক্রিপ্ট যোগ করতে পারেন কি প্রতিরোধ (অথবা সাবধান থাকুন) কেউ চলমান ./script.sh?

উত্তর:


15

শেল স্ক্রিপ্টে, $0বর্তমানে চলমান স্ক্রিপ্টের নাম। আপনি যদি এটি উত্সাহিত হয়ে থাকেন বা এটির মতো চালানো হচ্ছে তা জানাতে আপনি এটি ব্যবহার করতে পারেন:

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi

5

এর মধ্যে সহজ উপায় bash:

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE সর্বদা স্ক্রিপ্টের নাম / পথ থাকে।

$0 যখন কেবল উত্সাহিত হয় না তখন কেবল স্ক্রিপ্টের নাম / পথ থাকে।

সুতরাং তারা যখন মিলবে, তার অর্থ স্ক্রিপ্টটি উত্সাহিত হয়নি।


1

এটি এসও নিয়ে আলোচনা করা হয়েছে । @Barroyo দ্বারা সর্বাধিক সম্মত উত্তর নেই ব্যবহারের বলেছেন

[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."

@ উইল: ম্যানুয়ালটি বলেছে: একটি অ্যারে ভেরিয়েবল যার সদস্যরা উত্স ফাইল নাম যেখানে FUNCNAME অ্যারে ভেরিয়েবলের সাথে সম্পর্কিত শেল ফাংশন নাম সংজ্ঞায়িত করা হয়। কিভাবে একটি ফাংশন?
সার্ভ-ইনক

1

আর একটি বিকল্প এক্সিকিউট অনুমতি অনুমতি অপসারণ হতে পারে। সেক্ষেত্রে এটি কার্যকর করা যায় না তবে এটি এখনও উত্সাহিত করা যায়।


1
এটি অসম্পূর্ণ। আপনি এখনও bash scriptকোনও স্ক্রিপ্টে নির্বাহিত পতাকা নির্বিশেষে স্ক্রিপ্টগুলি চালাতে পারেন । এছাড়াও সাইগউইনের অধীনে (এই গণনাটি রয়েছে?) আপনি কার্যকর কার্যকর পতাকাগুলি নিতে পারবেন না।
টিনো

0

উদাহরণস্বরূপ, .sh থেকে .src এ এক্সটেনশন পরিবর্তন করতে $ 0 ( মাইকেলের উত্তর) চেক করা ছাড়াও দরকারী হতে পারে। এই স্ক্রিপ্টটি কার্যকর করা উচিত নয় এমন কাউকে বুঝতে এটি সহায়তা করবে।


0

একটি কাস্টম দোভাষী তৈরি করুন source_reminder:

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

এটি কার্যকর করার জন্য ভুলবেন না। তারপরে এটি আপনার স্ক্রিপ্টে ব্যবহার করুন:

#!/path/to/your/source_reminder
foo
bar
whatever

এখন আপনি যদি সোর্সিং না করে স্ক্রিপ্টটি চালান, অনুস্মারকটি তার কাজ করবে do


আমার স্নাতকের. #!/bin/echo do not executeবা #!/bin/falseবা #!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }। তবে এটি স্ক্রিপ্টটি এমন কিছু দিয়ে কার্যকর করা হয় না sh script(যেমন এটি শেবাংকে উপেক্ষা করে)।
টিনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.