আমি কি অন্য শেল স্ক্রিপ্ট থেকে শেল স্ক্রিপ্টের কোনও ফাংশন কল করতে পারি?


87

আমার কাছে 2 টি শেল স্ক্রিপ্ট রয়েছে।

দ্বিতীয় শেল স্ক্রিপ্ট ফাংশন নিম্নলিখিত রয়েছে second.sh

func1 
func2

প্রথম.শ কিছু পরামিতি সহ দ্বিতীয় শেল স্ক্রিপ্টকে কল করবে এবং সেই ফাংশনটির সাথে নির্দিষ্ট অন্যান্য পরামিতিগুলির সাথে ফানক 1 এবং ফানক 2 কল করবে।

এখানে আমি যে বিষয়ে কথা বলছি তার উদাহরণ দেওয়া হল

second.sh

val1=`echo $1`
val2=`echo $2`

function func1 {

fun=`echo $1`
book=`echo $2`

}

function func2 {

fun2=`echo $1`
book2=`echo $2`


}

first.sh

second.sh cricket football

func1 love horror
func2 ball mystery

আমি কীভাবে এটি অর্জন করতে পারি?


4
ডুপ্লিকেট - stackoverflow.com/questions/8352851/...
0xAX

4
v=$(echo $1)সম্পূর্ণ অপ্রয়োজনীয়। শুধু লিখুন fun2=$1। পার্থক্যটি হ'ল $()(বা ব্যাকটিক্স) ট্রেলিং করা নতুনলাইনগুলি সরিয়ে ফেলবে।
উইলিয়াম পার্সেল

4
যেহেতু কমান্ড লাইনের বিপরীতে শেল স্ক্রিপ্ট থেকে কোনও ফাংশন কল করার বিষয়ে বিশেষ কিছু নেই, তাই এই প্রশ্নটিকে "বাশ ফাংশনটি কীভাবে কল করা যায়?" এ নামিয়ে আনা যায়?
টম রাসেল

উত্তর:


146

আপনার second.shস্ক্রিপ্টটি এভাবে রিফ্যাক্টর করুন :

function func1 {
   fun=$1
   book=$2
   printf "fun=%s,book=%s\n" "${fun}" "${book}"
}

function func2 {
   fun2=$1
   book2=$2
   printf "fun2=%s,book2=%s\n" "${fun2}" "${book2}"
}

এবং তারপরে স্ক্রিপ্ট থেকে এই ফাংশনগুলিকে কল করুন first.sh:

source ./second.sh
func1 love horror
func2 ball mystery

আউটপুট:

fun=love,book=horror
fun2=ball,book2=mystery

12
অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া এড়াতে সাবধান হোন যে sourceকমান্ডটি আসলে যুক্তি হিসাবে পাস করা স্ক্রিপ্টটি চালাবে run
ডিভিএলকিউব

44

আপনি অন্য শেল স্ক্রিপ্টে সরাসরি কোনও ফাংশন কল করতে পারবেন না।

আপনি নিজের ফাংশন সংজ্ঞা একটি পৃথক ফাইলে স্থানান্তর করতে পারেন এবং তারপরে .কমান্ডটি ব্যবহার করে এটিকে আপনার স্ক্রিপ্টে লোড করতে পারেন:

. /path/to/functions.sh

এটি এমনটি ব্যাখ্যা করবে functions.shযেন এটিতে আপনার লিখিত সামগ্রীটি আসলে এই মুহুর্তে উপস্থিত ছিল। শেল ফাংশনগুলির ভাগ করা লাইব্রেরিগুলি প্রয়োগ করার জন্য এটি একটি সাধারণ প্রক্রিয়া।


4
এটি কি গ্রহণযোগ্য উত্তরের মতো নয়, যেহেতু .একটি উপনামের জন্য source?
আজশর্মা 20'18

10
ঠিক আছে, আমি প্রথমে উত্তর দিয়েছি, সুতরাং প্রযুক্তিগতভাবে গৃহীত উত্তরগুলি এটির মতোই :)। এছাড়াও, অনেক শেলের sourceজন্য একটি উপনাম থাকাকালীন ., এটি সর্বদা ক্ষেত্রে হয় না। উদাহরণস্বরূপ, dashদেবিয়ান প্যাকেজটি যা সরবরাহ করে /bin/sh, তাতে কোনও sourceকমান্ড নেই।
লারস্কস

sourceউবুন্টু @ আজশর্মাতে কমান্ড কাজ করেনি। তথ্যসূত্র: সোর্স কমান্ডটি শ শেলের মধ্যে পাওয়া যায় নি
rajeshmag

এত অদ্ভুত যে এই মন্তব্যটি সর্বোচ্চ হিসাবে আপবোট করা হয়নি? এটি সঠিক #! / বিন / শ সিন্ট্যাক্স এবং অন্যটি কেবল ব্যাশে কাজ করবে।
xddq

21

সমস্যাটি

কৌতূহলীভাবে গৃহীত উত্তর কেবল গুরুত্বপূর্ণ অবস্থার অধীনে কাজ করে। দেওয়া ...

/foo/bar/first.sh:

function func1 {  
   echo "Hello $1"
}

এবং

/foo/bar/second.sh:

#!/bin/bash

source ./first.sh
func1 World

এটি কেবল তখনই কাজ first.shকরে first.shযদি অবস্থিত একই ডিরেক্টরিতে চালিত হয়। অর্থাৎ। যদি শেলের বর্তমান চলমান পথটি হয় /fooতবে কমান্ড চালানোর চেষ্টা করা হবে

cd /foo
./bar/second.sh

মুদ্রণের ত্রুটি:

/foo/bar/second.sh: line 4: func1: command not found

এটি কারণ source ./first.shস্ক্রিপ্টের পথে নয়, বর্তমানের চলমান পথের সাথে সম্পর্কিত। সুতরাং একটি সমাধান সাবসেল ব্যবহার করে চালানো হতে পারে

(cd /foo/bar; ./second.sh)

আরও জেনেরিক সমাধান

দেওয়া ...

/foo/bar/first.sh:

function func1 {  
   echo "Hello $1"
}

এবং

/foo/bar/second.sh:

#!/bin/bash

source $(dirname "$0")/first.sh

func1 World

তারপর

cd /foo
./bar/second.sh

প্রিন্ট

Hello World

কিভাবে এটা কাজ করে

  • $0 সম্পাদিত স্ক্রিপ্টে আপেক্ষিক বা নিখুঁত পাথ প্রদান করে
  • dirname ডিরেক্টরিতে আপেক্ষিক পাথ ফেরায়, যেখানে $ 0 স্ক্রিপ্ট বিদ্যমান
  • $( dirname "$0" )dirname "$0"কমান্ড মৃত্যুদন্ড কার্যকর স্ক্রিপ্ট, যা পরে জন্য যুক্তি হিসেবে ব্যবহার করা হয় নির্দেশিকা আপেক্ষিক পাথ ফেরৎ sourceকমান্ড
  • "সেকেন্ড.শ" এ, /first.sh কেবল আমদানি করা শেল স্ক্রিপ্টের নাম করা হয়
  • source নির্দিষ্ট শেলটিতে নির্দিষ্ট ফাইলের সামগ্রী লোড করে

0

আপনি যদি সংজ্ঞা দিন

    #!/bin/bash
        fun1(){
          echo "Fun1 from file1 $1"
        }
fun1 Hello
. file2 
fun1 Hello
exit 0

file1 (chmod 750 file1) এবং file2 এ

   fun1(){
      echo "Fun1 from file2 $1"
    }
    fun2(){
      echo "Fun1 from file1 $1"
    }

এবং চালান। / ফাইল 2 আপনি ফাইল 1 থেকে ফান 1 পেয়ে যাবেন ফাইল 2 হ্যালো সারপ্রাইজ থেকে হ্যালো ফান 1! আপনি ফাইল 2 থেকে ফান 1-এর সাথে ফান 1 ওভাররাইট করেছেন ... যাতে এটি না করা আপনার অবশ্যই আবশ্যক

declare -f pr_fun1=$fun1
. file2
unset -f fun1
fun1=$pr_fun1
unset -f pr_fun1
fun1 Hello

এটি আপনার পূর্ববর্তী সংজ্ঞাটি ফান 1 এর জন্য সংরক্ষণ করে এবং পূর্ববর্তী নামটি মুছে ফেলা প্রয়োজনের সাথে এটি পুনরুদ্ধার করে imported প্রতিবার আপনি অন্য ফাইল থেকে ফাংশন আমদানি করার সময় আপনি দুটি দিক মনে করতে পারেন:

  1. আপনি বিদ্যমান নামগুলিকে একই নামের সাথে ওভাররাইট করতে পারেন (যদি সেই জিনিসটি আপনি চান যা আপনি অবশ্যই উপরে বর্ণিত হিসাবে সেগুলি সংরক্ষণ করতে পারেন)
  2. আমদানি ফাইলের সমস্ত সামগ্রী আমদানি করুন (ফাংশন এবং গ্লোবাল ভেরিয়েবলগুলিও) সাবধান! এটি বিপজ্জনক পদ্ধতি

-5
#vi function.sh

#!/bin/bash
f1() {
    echo "Hello $name"
}

f2() {
    echo "Enter your name: "
    read name
    f1
}
f2

#sh function.sh

এখানে ফাংশন f2কল হবে ফাংশনf1

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