फ़ंक्शन पैरामीटर द्वारा आपूर्ति की गई निष्पादित कमांड


17

मैं बैश स्क्रिप्ट में एक फ़ंक्शन विधि बनाने की कोशिश कर रहा हूं जो कि कमांड को निष्पादित करता है जो कि पैरामेट्स द्वारा विधि को आपूर्ति की जाती है।

कुछ इस तरह से अर्थ:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

मैं पहले से ही करने की कोशिश की मैं $@, "$@", $*, "$*"कैसे मुझे लगता है कि कर सकता है?


$@मेरे लिए काम करता है .. special() { $@; }... special echo "foo"देता हैfoo
Drav Sloan

इसने मेरे साथ काम नहीं किया: 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
चारों ओर उद्धरणों का उपयोग करें "$@", तो आपको अधिक सफलता मिलेगी :)
द्रविण स्लोअन

ठीक है। अब यह काम कर रहा है। ऐसा लगता है जैसे मैंने गड़बड़ की कोड वास्तविक कॉल को घेरता है।
ब्रेनस्टोन

कोई बात नहीं, हम सभी के पास
वो

जवाबों:


11

मुझे लगता है कि जब आप फ़ंक्शन में तर्क पारित कर रहे हैं तो यह केवल एक उद्धरण मुद्दा है।

इसे कॉल करने का प्रयास करें:

$ special_execute "echo 'abc'"
'abc'

यदि आप चारों ओर एकल उद्धरण नहीं चाहते हैं, abcतो इस तरह से उद्धरण बदलें:

$ special_execute "echo abc"
abc

डिबगिंग

आप फ़ंक्शन के इंटर्नल्स को लपेट सकते हैं ताकि यह अधिक वर्बोसिटी के साथ बाहर निकल जाए।

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

फिर जब आप फ़ंक्शन के माध्यम से कमांड चलाते हैं, special_executeतो आप देख सकते हैं कि क्या चल रहा है।

पीएस उदाहरण:

$ 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

उपनामों का उपयोग करते समय मुझे 'कमांड नहीं मिली' कहते हुए एक त्रुटि क्यों होती है?
ऐली जी।

@DrunkenPoney - ऐसा कोई cmd नहीं, यह है alias
स्लम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.