কোনও বাশ ফাংশন কীভাবে সংজ্ঞায়িত করা যায় যা বিভিন্ন স্ক্রিপ্ট ব্যবহার করতে পারে


13

আমি bashআমার ~/.bashrcফাইলে একটি ফাংশন সংজ্ঞায়িত করেছি । এটি আমাকে শেল টার্মিনালগুলিতে এটি ব্যবহার করতে দেয়। যাইহোক, আমি যখন এটি কোনও স্ক্রিপ্টের মধ্যে থেকে কল করি তখন এটি বিদ্যমান বলে মনে হয় না।

bashস্ক্রিপ্টগুলি ব্যবহার করার জন্য আমি কোনও ফাংশন কীভাবে সংজ্ঞায়িত করতে পারি ?


তবে আমার .bash_profile মূলত .basrc ফাইলটি পড়ে, তাই আমি লগইন বা অ-লগইন শেল ব্যবহার না করেই ফলাফলটি একই রকম আশা করব।
অন্টুরেএনও

আপনি কি /bin/shশেবাং লাইনে ব্যবহার করছেন ?
কেভিন

উত্তর:


9

~/.bash_profileএবং ~/.bashrcস্ক্রিপ্টগুলি দ্বারা পড়া হয় না এবং ফাংশনগুলি ডিফল্টরূপে রফতানি হয় না। এটি করতে, আপনি এটির export -fমতো ব্যবহার করতে পারেন :

$ cat > script << 'EOF'
#!/bin/bash
foo
EOF
$ chmod a+x script
$ ./script
./script: line 2: foo: command not found
$ foo() { echo "works" ; } 
$ export -f foo
$ ./script
works

export -f foo~/.bash_profileএই ফাংশনটি লগইনের পরে স্ক্রিপ্টগুলিতে উপলব্ধ করার জন্যও ডেকে আনা যেতে পারে । সতর্কতা অবলম্বন করুন যে export -fবহনযোগ্য নয়।

আরও ভাল সমাধান হ'ল ফাংশনটি ব্যবহার করে ফাইলটি উত্স করা . file। এটি অনেক বেশি বহনযোগ্য এবং আপনার পরিবেশ কোনও নির্দিষ্ট উপায়ে সেট আপ করার উপর নির্ভর করে না।


কেন শুধু মত একটি ফাংশন ঘোষণা করবেন function myFunction { ... }না ~/.bash_profileএবং আপনি যেতে ভাল?
উভচর

যদি আমি আপনার উত্তরটি সঠিকভাবে বুঝতে পারি (ফাংশনটি দিয়ে কোনও ফাইল উত্সাহিত করার বিষয়ে), এর অর্থ হ'ল আমাকে প্রতিটি স্ক্রিপ্টে স্পষ্টভাবে ফাইলটি উত্স করতে হবে, যা বেশ বিরক্তিকর। এটি প্রতিটি স্ক্রিপ্টে নিজেই ফাংশনটি অনুলিপি-করা চেয়ে জটিল কিছু নয়। আমি কিছু লাইন সংরক্ষণ করতে হবে, অবশ্যই, কিন্তু সব। তবে exportসমাধানটি সঠিকভাবে কাজ করছে বলে মনে হচ্ছে। ধন্যবাদ।
অন্টুরেওনিও

@ ফোম্পাইল, স্ক্রিপ্ট থেকে ফাংশনটি কল করার সময় এটি আমি ঠিক করেছি এবং কাজ করে না।
অন্টুরেওনিও

1
@ অ্যান্টেরনেও: দ্বিতীয় ক্রিস-ডাউন প্রস্তাবিত পদ্ধতিটি আসলেই আরও ভাল: 1) যখন কেউ স্ক্রিপ্টটি পড়েন, তারা সচেতন হন যে এটির কোনওটির fooথেকে কিছু ফাংশন প্রয়োজন needs file) আপনি যে কনট্রাক্ট শেলটি চেয়েছেন তার চেয়ে ভাল আপনি এটির বিষয়বস্তু নিয়ন্ত্রণ করতে পারবেন filesure fooআপনার স্ক্রিপ্ট চালু করার আগে পরিবর্তন হয়নি । fileউদাহরণস্বরূপ, আপনি এটি পরীক্ষা না করা নিশ্চিত করতে সুরক্ষা চেক যোগ করতে পারেন। (সহজ নয়, তবে সম্ভব)। (ভাল, আপনি এই চেকগুলি সংজ্ঞায়িত foo ফাংশনটিতেও করতে পারেন ... তবে আপনি আমার বামন পান ^^ আমি মনে করি পদ্ধতিটি 2 টি আরও পরিষ্কার)) 3) fileকেবলমাত্র যা প্রয়োজন তা থাকবে, আরও কিছু নয়।
অলিভিয়ার ডুলাক

8

.bashrcকেবল ইন্টারেক্টিভ শেল দ্বারা পঠিত হয়। (আসলে, যে একটি অতিসরলীকরণ আছে: ব্যাশ এ ব্যাপারে করা বিচিত্র নয় ব্যাশ পড়া নেই। .bashrcযদি এটি একটি লগ-ইন শেল এর, ইন্টারেক্টিভ বা না এবং সেখানে এমনকি ব্যতিক্রম একটি ব্যতিক্রম আছে:। যদি ব্যাশ এর অভিভাবক প্রক্রিয়া rshdবা sshd, তারপর ব্যাশ পড়া নেই .bashrc, ইন্টারেক্টিভ হোক বা না হোক।)

আপনার ফাংশন সংজ্ঞাটি কোনও স্থানে কোনও ফাইলের মধ্যে রাখুন এবং সেই ফাইলটিকে স্ক্রিপ্টে অন্তর্ভুক্ত করতে .(বানানযুক্ত source) বিল্টিন ব্যবহার করুন ।

$ cat ~/lib/bash/my_functions.bash
foo () {

$ cat ~/bin/myscript
#!/bin/bash
. ~/lib/bash/my_functions.bash
foo bar

আপনি যদি চান, আপনি ksh এর অটোল্যাড বৈশিষ্ট্যটি অনুসরণ করতে পারেন। ফাংশন হিসাবে একই নামের একটি ফাইলে প্রতিটি ফাংশন সংজ্ঞা রাখুন। চলকটিতে ফাংশন সংজ্ঞা সম্বলিত ডিরেক্টরিগুলি তালিকাভুক্ত করুন FPATH(ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা)। এখানে ksh এর একটি অপরিশোধিত অনুমান autoloadযা প্রকৃতপক্ষে অন-ডিমান্ডের পরিবর্তে ফাংশনটি লোড করে:

autoload () {
  set -- "$(set +f; IFS=:;
            for d in $FPATH; do
              if [ -r "$d/$1" ]; then echo -E "$d/$1"; break; fi;
            done)"
  [[ -n $1 ]] && . "$1"
}

অটোলোয়াডের জন্য +1, যদিও আমি ব্যাশ দিয়ে আসাগুলি ব্যবহার করার পরামর্শ দিই। সর্বশেষতমটি একটি অলস বোঝা সমর্থন করে।
স্টারফিশ

0

আপনার কি কোনও ফাংশন দরকার ? যদি তা না হয় তবে যুক্তিটিকে আপনার পৃথক, একা একা বাশ স্ক্রিপ্টে টেনে আনতে বিবেচনা করুন $PATH। উদাহরণস্বরূপ, আমার এটিতে আমার ছিল ~/.bashrc:

# echo public IP address
alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'

~/binআমার মধ্যে রয়েছে $PATH, সুতরাং আমি ~/bin/wanipনিম্নলিখিত বিষয়গুলি দিয়ে তৈরি করেছি :

#!/bin/bash

# echo public IP address
dig +short myip.opendns.com @resolver1.opendns.com

এবং chmod 0755 ~/bin/wanipএটি কার্যকর করতে দৌড়ে । এখন আমি wanipঅন্যান্য স্ক্রিপ্ট থেকে সম্পাদন করতে পারি ।

আমি wanipএকা একা বাশ স্ক্রিপ্ট থাকা পছন্দ করি । এটি আমাকে মনে করিয়ে দেয় যে আমি এই যুক্তিটি সাধারণত উপলভ্য চাই (কেবলমাত্র আমার বর্তমান ইন্টারেক্টিভ বাশ সেশনের পাশাপাশি)। স্ক্রিপ্টটি দুর্দান্তভাবে যুক্তির জন্য যুক্ত করে এবং ডকুমেন্টেশনগুলিকে আবদ্ধ করে।

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