আমার একটি স্ক্রিপ্ট রয়েছে যার কিছু ফাংশন রয়েছে।
আমি কি কমান্ড লাইন থেকে সরাসরি কোনও ফাংশন চালাতে পারি?
এটার মতো কিছু?
myScript.sh func()
আমার একটি স্ক্রিপ্ট রয়েছে যার কিছু ফাংশন রয়েছে।
আমি কি কমান্ড লাইন থেকে সরাসরি কোনও ফাংশন চালাতে পারি?
এটার মতো কিছু?
myScript.sh func()
উত্তর:
যদি স্ক্রিপ্টটি কেবল ফাংশনগুলি সংজ্ঞায়িত করে এবং অন্য কিছু না করে, আপনি প্রথমে বর্তমান শেলটির প্রেক্ষাপটে source
বা .
কমান্ড ব্যবহার করে স্ক্রিপ্টটি সম্পাদন করতে পারেন এবং তারপরে কেবল ফাংশনটি কল করতে পারেন। দেখুন help source
আরও তথ্যের জন্য।
bash
), এবং exit
কেবল সাবশেলটি শেষ করবেন তবে আপনার টার্মিনালটি নয়।
ঠিক আছে, অন্য উত্তরগুলি সঠিক হলেও - আপনি অবশ্যই অন্য কিছু করতে পারেন: যদি আপনার বাশ স্ক্রিপ্টের অ্যাক্সেস থাকে তবে আপনি এটি পরিবর্তন করতে পারেন এবং কেবলমাত্র বিশেষ প্যারামিটারটি রেখে দিতে পারেন "$@"
- যা কমান্ড লাইনের যুক্তিগুলিতে প্রসারিত হবে আপনি উল্লেখ করেছেন, এবং যেহেতু এটি "একা" শেল তাদের ভারব্যাটিম বলার চেষ্টা করবে; এবং এখানে আপনি প্রথম যুক্তি হিসাবে ফাংশন নাম নির্দিষ্ট করতে পারে। উদাহরণ:
$ 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
"$@"
বেশিরভাগ ক্ষেত্রে ব্যবহার করুন । $@
কিছু ক্ষেত্রে নিরাপদ নয়।
bash test.sh testA testB
পারি?
[ ! -z "$1" ]
এটিকেও মোড়ানো দরকার অন্যথায় উত্সটি অন্য কিছু বিবৃতিতে অন্য বিবৃতি উত্থাপন করবে
নিম্নলিখিত কমান্ডটি প্রথমে প্রসঙ্গে ফাংশনটি নিবন্ধভুক্ত করে, তারপরে এটি কল করে:
. ./myScript.sh && function_name
সংক্ষেপে, না।
আপনি স্ক্রিপ্টের সমস্ত ফাংশন আপনার পরিবেশে source
( help source
বিশদ জন্য) দিয়ে আমদানি করতে পারেন যা আপনাকে সেগুলি কল করার অনুমতি দেবে। এটিতে স্ক্রিপ্টটি কার্যকর করার প্রভাব রয়েছে, তাই যত্ন নিন।
শেল স্ক্রিপ্ট থেকে কোনও ফাংশন কল করার কোনও উপায় নেই যেমন এটি কোনও ভাগ করা লাইব্রেরি।
ব্যবহার 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
সম্পাদনা: সতর্কতা - মনে হয় এটি সমস্ত ক্ষেত্রে কার্যকর হয় না, তবে অনেকগুলি সরকারী স্ক্রিপ্টগুলিতে ভাল কাজ করে।
আপনার যদি "নিয়ন্ত্রণ" নামে একটি বাশ স্ক্রিপ্ট থাকে এবং এর ভিতরে আপনার "বিল্ড" নামে একটি ফাংশন থাকে:
function build() {
...
}
তারপরে আপনি এটিকে কল করতে পারেন (ডিরেক্টরিটি যেখানে এটি রয়েছে) থেকে:
./control build
যদি এটি অন্য ফোল্ডারের ভিতরে থাকে তবে এটি এটি তৈরি করবে:
another_folder/control build
যদি আপনার ফাইলটিকে "নিয়ন্ত্রণ.sh" বলা হয়, ততক্ষণে এটি ফাংশনটিকে কল করার মতো করে তুলবে:
./control.sh build
. ./control.sh && build
আমার এমন পরিস্থিতি আছে যেখানে আমার বাশ স্ক্রিপ্ট থেকে একটি ফাংশন প্রয়োজন যা আগে সম্পাদন করা উচিত নয় (উদাহরণস্বরূপ source
) এবং সমস্যাটি @$
হ'ল মাইস্ক্রিপ্ট.শ এর পরে দু'বার চালানো হয়, মনে হয় ... তাই আমি ধারণাটি নিয়ে এসেছি সেড দিয়ে ফাংশনটি পেতে:
sed -n "/^func ()/,/^}/p" myScript.sh
এবং আমার প্রয়োজনের সময় এটি কার্যকর করতে, আমি এটি একটি ফাইলে রেখেছি এবং ব্যবহার করি source
:
sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
আপনি নীচের মত কমান্ড লাইন আর্গুমেন্ট থেকে ফাংশন কল করতে পারেন
function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1
একবার আপনি ফাংশন শেষ করার পরে যুক্তিটি স্বীকার করতে $ 1 চাপুন এবং উপরের কোডটি মজাতে বলুন ফাংশন চালানোর জন্য fun.sh এ সংরক্ষণ করা হয়েছে /
সমাধান করা পোস্ট তবে আমি আমার পছন্দসই সমাধানটি উল্লেখ করতে চাই। যথা, জেনেরিক ওয়ান-লাইনার স্ক্রিপ্ট সংজ্ঞায়িত করুন eval_func.sh
:
#!/bin/bash
source $1 && shift && "@a"
তারপরে যেকোন স্ক্রিপ্টের মধ্যে যে কোনও ফাংশন কল করুন:
./eval_func.sh <any script> <any function> <any args>...
গ্রহণযোগ্য সমাধানটি নিয়ে আমি যে সমস্যার সমাধান করেছিলাম তা হ'ল আমার ফাংশনযুক্ত স্ক্রিপ্টটিকে অন্য স্ক্রিপ্টের মধ্যে সস করার সময়কালের যুক্তিগুলি প্রাক্তন দ্বারা মূল্যায়ন করে ত্রুটি সৃষ্টি করে।
exit
আপনার ফাংশনে ব্যবহার করেন তবে এটি ফাংশনটি কার্যকর হওয়ার পরে টার্মিনালটি বন্ধ করে দেবে। এই কাছাকাছি কোন উপায় আছে? @ স্পেনমার্নাচ