কমান্ড লাইনে স্ক্রিপ্ট থেকে আমি কীভাবে একটি ফাংশন চালাতে পারি?


119

আমার একটি স্ক্রিপ্ট রয়েছে যার কিছু ফাংশন রয়েছে।

আমি কি কমান্ড লাইন থেকে সরাসরি কোনও ফাংশন চালাতে পারি?

এটার মতো কিছু?

myScript.sh func()

উত্তর:


66

যদি স্ক্রিপ্টটি কেবল ফাংশনগুলি সংজ্ঞায়িত করে এবং অন্য কিছু না করে, আপনি প্রথমে বর্তমান শেলটির প্রেক্ষাপটে sourceবা .কমান্ড ব্যবহার করে স্ক্রিপ্টটি সম্পাদন করতে পারেন এবং তারপরে কেবল ফাংশনটি কল করতে পারেন। দেখুন help sourceআরও তথ্যের জন্য।


1
এই পদ্ধতির সাথে একমাত্র সমস্যাটি হ'ল যদি আপনি exitআপনার ফাংশনে ব্যবহার করেন তবে এটি ফাংশনটি কার্যকর হওয়ার পরে টার্মিনালটি বন্ধ করে দেবে। এই কাছাকাছি কোন উপায় আছে? @ স্পেনমার্নাচ
ব্যবহারকারী 1527227

@ ব্যবহারকারী 1527227: আপনার শেল স্ক্রিপ্টের নিয়ন্ত্রণ থাকলে এই ক্ষেত্রে পরবর্তী উত্তরটি সহ যান। যদি আপনি এটি না করেন তবে আপনি প্রথমে একটি ইন্টারেক্টিভ সাবশেলকে কল করতে পারেন (কেবল সন্নিবেশ করুন bash), এবং exitকেবল সাবশেলটি শেষ করবেন তবে আপনার টার্মিনালটি নয়।
সোভেন মারনাচ

238

ঠিক আছে, অন্য উত্তরগুলি সঠিক হলেও - আপনি অবশ্যই অন্য কিছু করতে পারেন: যদি আপনার বাশ স্ক্রিপ্টের অ্যাক্সেস থাকে তবে আপনি এটি পরিবর্তন করতে পারেন এবং কেবলমাত্র বিশেষ প্যারামিটারটি রেখে দিতে পারেন "$@"- যা কমান্ড লাইনের যুক্তিগুলিতে প্রসারিত হবে আপনি উল্লেখ করেছেন, এবং যেহেতু এটি "একা" শেল তাদের ভারব্যাটিম বলার চেষ্টা করবে; এবং এখানে আপনি প্রথম যুক্তি হিসাবে ফাংশন নাম নির্দিষ্ট করতে পারে। উদাহরণ:

$ cat test.sh
testA() {
  echo "TEST A $1";
}

testB() {
  echo "TEST B $2";
}

"$@"


$ bash test.sh
$ bash test.sh testA
TEST A 
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2

পোলিশের জন্য, আপনি প্রথমে যাচাই করতে পারেন যে কমান্ডটি বিদ্যমান এবং এটি একটি ফাংশন:

# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
  # call arguments verbatim
  "$@"
else
  # Show a helpful error
  echo "'$1' is not a known function name" >&2
  exit 1
fi

16
"$@"বেশিরভাগ ক্ষেত্রে ব্যবহার করুন । $@কিছু ক্ষেত্রে নিরাপদ নয়।
fumiyas

1
কিভাবে একটি ফাংশন চেয়ে বেশি চালানো? উদাহরণস্বরূপ আমি চালাতে bash test.sh testA testBপারি?
জেফ প্যাং

[ ! -z "$1" ]এটিকেও মোড়ানো দরকার অন্যথায় উত্সটি অন্য কিছু বিবৃতিতে অন্য বিবৃতি উত্থাপন করবে
জ্যাকলিয়ো

আমি এই যাদুকরী "$ @" ভেরিয়েবলটি খুব কাছ থেকে অনুসন্ধান করে যাচ্ছিলাম যে কোনও ফাইলে যে কোনও ফাংশন ডাকা হবে তা ব্যবহার করার জন্য, আপনাকে ধন্যবাদ @ সিডাউ!
জাস্টিন হ্যামন্ড

36

নিম্নলিখিত কমান্ডটি প্রথমে প্রসঙ্গে ফাংশনটি নিবন্ধভুক্ত করে, তারপরে এটি কল করে:

. ./myScript.sh && function_name

1
আপনি সোজা উত্স ব্যবহার করতে পারেন। উৎস myScript.sh && FUNCTION_NAME - মতই
stolen_leaves

17

সংক্ষেপে, না।

আপনি স্ক্রিপ্টের সমস্ত ফাংশন আপনার পরিবেশে source( help sourceবিশদ জন্য) দিয়ে আমদানি করতে পারেন যা আপনাকে সেগুলি কল করার অনুমতি দেবে। এটিতে স্ক্রিপ্টটি কার্যকর করার প্রভাব রয়েছে, তাই যত্ন নিন।

শেল স্ক্রিপ্ট থেকে কোনও ফাংশন কল করার কোনও উপায় নেই যেমন এটি কোনও ভাগ করা লাইব্রেরি।


1
আমি মনে করি উপযুক্ত উত্তর হিসাবে এটি আরও ওজন দেওয়া উচিত। আমি ওপি যা চাইছে তার অনুরূপ কিছু করার চেষ্টা করেছি, তবে শেল স্ক্রিপ্টিং কেবল "ক্লিন-কাট, ওওপি ডেভলপমেন্ট" (আইএমএইচও) এর জন্য ইঞ্জিনিয়ার হয় না।
ড্যান এল

4

ব্যবহার case

#!/bin/bash

fun1 () {
    echo "run function1"
    [[ "$@" ]] && echo "options: $@"
}

fun2 () {
    echo "run function2"
    [[ "$@" ]] && echo "options: $@"
}

case $1 in
    fun1) "$@"; exit;;
    fun2) "$@"; exit;;
esac

fun1
fun2

এই স্ক্রিপ্টটি ফাংশন ফান 1 এবং ফান 2 চালাবে তবে আপনি বিকল্প ফান 1 বা ফান 2 দিয়ে এটি শুরু করলে এটি কেবল প্রদত্ত ফাংশনটি (যদি সরবরাহ করা থাকে) চালিত হবে এবং প্রস্থান করবে। ব্যবহার

$ ./test 
run function1
run function2

$ ./test fun2 a b c
run function2
options: a b c

1

সম্পাদনা: সতর্কতা - মনে হয় এটি সমস্ত ক্ষেত্রে কার্যকর হয় না, তবে অনেকগুলি সরকারী স্ক্রিপ্টগুলিতে ভাল কাজ করে।

আপনার যদি "নিয়ন্ত্রণ" নামে একটি বাশ স্ক্রিপ্ট থাকে এবং এর ভিতরে আপনার "বিল্ড" নামে একটি ফাংশন থাকে:

function build() { 
  ... 
}

তারপরে আপনি এটিকে কল করতে পারেন (ডিরেক্টরিটি যেখানে এটি রয়েছে) থেকে:

./control build

যদি এটি অন্য ফোল্ডারের ভিতরে থাকে তবে এটি এটি তৈরি করবে:

another_folder/control build

যদি আপনার ফাইলটিকে "নিয়ন্ত্রণ.sh" বলা হয়, ততক্ষণে এটি ফাংশনটিকে কল করার মতো করে তুলবে:

./control.sh build

1
এটি আমার জন্য ইন্টারেক্টিভ শেলটিতে কাজ করে নি। তবে এটি কাজ করেছে:. ./control.sh && build
saulius2

1

আমার এমন পরিস্থিতি আছে যেখানে আমার বাশ স্ক্রিপ্ট থেকে একটি ফাংশন প্রয়োজন যা আগে সম্পাদন করা উচিত নয় (উদাহরণস্বরূপ source) এবং সমস্যাটি @$হ'ল মাইস্ক্রিপ্ট.শ এর পরে দু'বার চালানো হয়, মনে হয় ... তাই আমি ধারণাটি নিয়ে এসেছি সেড দিয়ে ফাংশনটি পেতে:

sed -n "/^func ()/,/^}/p" myScript.sh

এবং আমার প্রয়োজনের সময় এটি কার্যকর করতে, আমি এটি একটি ফাইলে রেখেছি এবং ব্যবহার করি source:

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh


0

আপনি নীচের মত কমান্ড লাইন আর্গুমেন্ট থেকে ফাংশন কল করতে পারেন

function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1

একবার আপনি ফাংশন শেষ করার পরে যুক্তিটি স্বীকার করতে $ 1 চাপুন এবং উপরের কোডটি মজাতে বলুন ফাংশন চালানোর জন্য fun.sh এ সংরক্ষণ করা হয়েছে /


0

সমাধান করা পোস্ট তবে আমি আমার পছন্দসই সমাধানটি উল্লেখ করতে চাই। যথা, জেনেরিক ওয়ান-লাইনার স্ক্রিপ্ট সংজ্ঞায়িত করুন eval_func.sh:

#!/bin/bash
source $1 && shift && "@a"

তারপরে যেকোন স্ক্রিপ্টের মধ্যে যে কোনও ফাংশন কল করুন:

./eval_func.sh <any script> <any function> <any args>...

গ্রহণযোগ্য সমাধানটি নিয়ে আমি যে সমস্যার সমাধান করেছিলাম তা হ'ল আমার ফাংশনযুক্ত স্ক্রিপ্টটিকে অন্য স্ক্রিপ্টের মধ্যে সস করার সময়কালের যুক্তিগুলি প্রাক্তন দ্বারা মূল্যায়ন করে ত্রুটি সৃষ্টি করে।

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