ফাংশন পরামিতি দ্বারা সরবরাহ কমান্ড কার্যকর করুন


15

আমি ব্যাশ স্ক্রিপ্টে একটি ফাংশন পদ্ধতি তৈরি করার চেষ্টা করছি যা পরামিতিগুলির দ্বারা পদ্ধতিতে সরবরাহ করা একটি কমান্ড কার্যকর করে।

এর অর্থ কিছু অর্থ:

special_execute()
{
    # Some code

    # Here's the point where the command gets executed
    $@

    # More code
}

special_execute echo "abc"

আমি ইতিমধ্যে চেষ্টা আমি $@, "$@", $*, "$*"কিভাবে আমি যে কি করতে পারেন?


$@আমার জন্য কাজ করে .. special() { $@; }... special echo "foo"দেয়foo
ড্রভ স্লোয়ান

এটি আমার সাথে কাজ করে নি: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'এবংtar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
ব্রেইনস্টোন

3
চারপাশে উদ্ধৃতি ব্যবহার করুন "$@", তারপরে আপনার আরও সাফল্য হবে :)
ড্রভ স্লোয়ান

ঠিক আছে. এখন এটা কাজ করছে. দেখে মনে হচ্ছে আমি আসল কলটির চারপাশে কোডটি বিভ্রান্ত করেছি।
ব্রেইনস্টোন

কোনও সমস্যা নেই, আমাদের সবার সেই মুহুর্তগুলি রয়েছে :)
ড্রভ স্লোয়ান

উত্তর:


10

আমার মনে হয় আপনি যখন যুক্তিটি ফাংশনে প্রবেশ করছেন তখন এটি কেবল একটি উদ্ধৃত সমস্যা।

এটিকে এভাবে ডাকার চেষ্টা করুন:

$ special_execute "echo 'abc'"
'abc'

আপনি যদি একক কোট চারপাশে না চান তবে উদ্ধৃতিটি এর abcমতো পরিবর্তন করুন:

$ special_execute "echo abc"
abc

ডিবাগ

আপনি ফাংশনটির অভ্যন্তরীণ অংশগুলি মোড়ানো করতে পারেন যাতে এটি আরও ভার্বোসিস সহ প্রতিধ্বনিত হয়।

$ function special_execute() { set -x; "$@"; set +x; }

তারপরে আপনি যখন ফাংশনটির মাধ্যমে কমান্ডগুলি চালাবেন, special_executeআপনি দেখতে পাচ্ছেন কী চলছে।

PS উদাহরণ:

$ special_execute ps -eaf
+ ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug21 ?        00:00:01 /sbin/init
root         2     0  0 Aug21 ?        00:00:00 [kthreadd]
...

পার্ল উদাহরণ:

$ special_execute perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
+ perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
1
2
3
4
5
6
7
8
9
10
+ set +x

যুক্তি পার্সিং $1

হিসাবে পাস যে কোনও যুক্তি পার্স করার জন্য আপনি এই জাতীয় কিছু করতে পারেন $1

$ function special_execute() { 
    [ "$1" -eq "-123" ] && echo "flagY" || echo "flagN"; 
    shift; 
    set -x; "$@"; set +x; 
  }

উদাহরণ

ডিবাগিং সক্ষম সহ:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
+ perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
1
2
3
4
5
+ set +x

ডিবাগিং বন্ধ সহ - -123:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
1
2
3
4
5

ডিবাগিং বন্ধ সহ - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5

এলিয়াস ব্যবহার করার সময় কেন আমি 'কমান্ড খুঁজে পাইনি' বলতে ত্রুটি পাই?
এলি জি

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