$ 0 এবং BASH_SOURCE এর মধ্যে নির্বাচন করা


118

একজন কীভাবে "$0"এবং এর মধ্যে নির্বাচন করে"${BASH_SOURCE[0]}"

জিএনইউ থেকে প্রাপ্ত এই বিবরণটি আমাকে খুব একটা সহায়তা করে নি।

    BASH_SOURCE

 An array variable whose members are the source filenames where the
 corresponding shell function names in the FUNCNAME array variable are
 defined. The shell function ${FUNCNAME[$i]} is defined in the file
 ${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}

BASH_SOURCEbash-3.0-alpha এ যুক্ত হয়েছিল। আপনার টেস্টিং সিস্টেমের উপর নির্ভর করে আপনার এটি নাও থাকতে পারে। আমি এটি প্রাথমিক সোলারিস এবং ওএস এক্স উভয়ই অনুপস্থিত পেয়েছি। এছাড়াও ফিরে দেখুন: ইউ এন্ড এল.এসইতে কোনও ফাংশন বা উত্সযুক্ত স্ক্রিপ্ট থেকে কেবল 'ফিরতে' পারে can
jww

উত্তর:


174

দ্রষ্টব্য: একটি পসিক্স-সম্মতিযুক্ত সমাধানের জন্য, এই উত্তরটি দেখুন

${BASH_SOURCE[0]}(অথবা, আরও সহজভাবে, $BASH_SOURCE[1] ) সমস্ত অনুরোধের দৃশ্যে ধারণ স্ক্রিপ্টের (সম্ভাব্য আপেক্ষিক) পথ ধারণ করে , বিশেষত যখন স্ক্রিপ্টটি উত্সাহিত হয় তখনও এটি সত্য নয় $0

তদ্ব্যতীত, চার্লস ডাফি যেমন উল্লেখ করেছেন, কলকারী $0একটি নির্বিচার মানতে সেট করতে পারেন ।
উল্টো দিকে, খালি $BASH_SOURCE থাকতে পারে, যদি কোনও নামযুক্ত ফাইল জড়িত না থাকে; উদাহরণ:
echo 'echo "[$BASH_SOURCE]"' | bash

নিম্নলিখিত উদাহরণে এই প্রকাশ করে:

লিপি foo:

#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"

$ bash ./foo
[./foo] vs. [./foo]

$ ./foo
[./foo] vs. [./foo]

$ . ./foo
[bash] vs. [./foo]

$0পসিএক্স শেল স্পেসিফিকেশনের অংশ, যদিও BASH_SOURCEনামটি থেকে বোঝা যায়, বাশ-নির্দিষ্ট।


[1] readingচ্ছিক পড়া: ${BASH_SOURCE[0]}বনাম$BASH_SOURCE :

বাশ আপনাকে স্কেলারের স্বরলিপি ব্যবহার করে 0একটি অ্যারে ভেরিয়েবলের উপাদান উল্লেখ করতে দেয় : লেখার পরিবর্তে , আপনি লিখতে পারেন ; অন্য কথায়: আপনি যদি ভেরিয়েবলটিকে রেফার করে রাখেন যেন এটি একটি স্কেলারের মতো হয় তবে আপনি সূচিতে উপাদানটি পান । ${arr[0]}$arr0

এই বৈশিষ্ট্যটি ব্যবহার করা সত্যটি $arrএকটি অ্যারেটিকে অস্পষ্ট করে , এ কারণেই জনপ্রিয় শেল-কোড লিন্টার শেলচেক.net নিম্নলিখিত সতর্কতা জারি করে (এই লেখার মতো):

SC2128: একটি সূচি ব্যতীত একটি অ্যারের প্রসারিত করা কেবল প্রথম উপাদান দেয়।

একদিকে নোট: যদিও এই সতর্কতাটি সহায়ক, তবুও এটি আরও সুনির্দিষ্ট হতে পারে, কারণ আপনি অগত্যা প্রথম উপাদানটি পাবেন না : এটি বিশেষত সূচকগুলিতে 0ফিরে আসে যে উপাদানটি , তাই যদি প্রথম উপাদানটির উচ্চতর সূচক থাকে - যা বাশে সম্ভব - আপনি খালি স্ট্রিং পাবেন; চেষ্টা 'a[1]='hi'; echo "$a"'
(বিপরীতে zsh, কখনও দলত্যাগী প্রকৃতপক্ষে করে প্রথম উপাদান আসতে তার সূচক নির্বিশেষে)।

আপনি তার দুর্বোধ্যতা কারণে এই বৈশিষ্ট্যটি পরিহার করা চয়ন করতে পারেন, কিন্তু এটা predictably কাজ করে এবং, যৌক্তিকভাবে বলা যায়, আপনি খুব কমই, যদি কখনও, ব্যবহার করার দরকার সূচকের করব অন্যান্য তুলনায় 0অ্যারে ভেরিয়েবলের ${BASH_SOURCE[@]}


সুতরাং $ BASH_SOURCE আরও জেনেরিক এবং আরও পরিস্থিতিতে কাজ করে?
আলেকজান্ডার মিলস

2
@ আলেকজান্ডারমিলস হ্যাঁ, আপনি যদি ব্যাশ ব্যবহার করছেন $BASH_SOURCEতবে ভাল পছন্দ।
mklement0

18

এই স্ক্রিপ্টগুলি চিত্রিত করতে সহায়তা করতে পারে। বাইরের স্ক্রিপ্টটি মধ্যবর্তী স্ক্রিপ্টকে ডাকে, যা অভ্যন্তরীণ স্ক্রিপ্টকে বলে:

$ cat outer.sh
#!/usr/bin/env bash
./middle.sh
$ cat middle.sh
#!/usr/bin/env bash
./inner.sh
$ cat inner.sh
#!/usr/bin/env bash
echo "\$0 = '$0'"
echo "\${BASH_SOURCE[0]} = '${BASH_SOURCE[0]}'"
echo "\${BASH_SOURCE[1]} = '${BASH_SOURCE[1]}'"
echo "\${BASH_SOURCE[2]} = '${BASH_SOURCE[2]}'"
$ ./outer.sh
$0 = './inner.sh'
$BASH_SOURCE[0] = './inner.sh'
$BASH_SOURCE[1] = ''
$BASH_SOURCE[2] = ''

তবে, আমরা যদি স্ক্রিপ্ট কলগুলিতে sourceবিবৃতিতে পরিবর্তন করি :

$ cat outer.sh
#!/usr/bin/env bash
source ./middle.sh
$ cat middle.sh
#!/usr/bin/env bash
source ./inner.sh
$ cat inner.sh
#!/usr/bin/env bash
echo "\$0 = '$0'"
echo "\${BASH_SOURCE[0]} = '${BASH_SOURCE[0]}'"
echo "\${BASH_SOURCE[1]} = '${BASH_SOURCE[1]}'"
echo "\${BASH_SOURCE[2]} = '${BASH_SOURCE[2]}'"
$ ./outer.sh
$0 = './outer.sh'
$BASH_SOURCE[0] = './inner.sh'
$BASH_SOURCE[1] = './middle.sh'
$BASH_SOURCE[2] = './outer.sh'

1

বহনযোগ্যতার জন্য, ${BASH_SOURCE[0]}এটি সংজ্ঞায়িত হয়ে গেলে এবং $0অন্যথায় ব্যবহার করুন। যে দেয়

${BASH_SOURCE[0]:-$0}

উল্লেখযোগ্যভাবে, zsh বলার ক্ষেত্রে, স্ক্রিপ্টটি sourced থাকলেও $ 0 এ সঠিক ফাইলপথ থাকে ।

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