2009-02-20 12 views
13

मैं पर्ल के system() कमांड में bash सिंटैक्स का उपयोग कैसे कर सकता हूं?मैं पर्ल सिस्टम() में बैश सिंटैक्स का उपयोग कैसे कर सकता हूं?

मेरे पास एक आदेश है जो बैश-विशिष्ट है, उदा। निम्नलिखित है, जो पार्टी की प्रक्रिया प्रतिस्थापन का उपयोग करता है:

diff <(ls -l) <(ls -al) 

मैं इसे पर्ल से कॉल करने के लिए,

system("diff <(ls -l) <(ls -al)") 

का उपयोग कर चाहते हैं, लेकिन यह मुझे एक त्रुटि देता है क्योंकि यह आदेश पर अमल करने bash के बजाय sh उपयोग कर रहा है :

sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `sort <(ls)' 

उत्तर

45

पर्ल को सीधे बैश का आह्वान करने के लिए कहें। आपके हवाले से की जटिलता को कम करने के लिए system() की list संस्करण का उपयोग करें: vladr के जवाब के साथ

sub system_bash { 
    my @args = ("bash", "-c", shift); 
    system(@args); 
} 

system_bash('echo $SHELL'); 
system_bash('diff <(ls -l) <(ls -al)'); 
+1

+1 सूची प्रकार –

+3

का उपयोग करने के लिए +1 यह आपको bash – cjm

+0

चलाने के लिए केवल इनकार/बिन/sh से रोकता है, मैं सहमत हूं, सूची संस्करण अच्छा है। – Frank

5
system("bash -c 'diff <(ls -l) <(ls -al)'") 

सिद्धांत रूप में यह करना चाहिए। मैन पेज के अनुसार, बैश का -c विकल्प आपको निष्पादित करने के लिए शेल कमांड पास करने की अनुमति देता है।

4

समस्या यह है कि यह है:

my @args = ("bash", "-c", "diff <(ls -l) <(ls -al)"); 
system(@args); 

तुम भी एक सबरूटीन परिभाषित कर सकते हैं अगर आप अक्सर पर्याप्त ऐसा करने पर योजना सिस्टम कमांड से STDOUT तक आउटपुट कैप्चर नहीं करेगा (जिसे आप आमतौर पर चाहते हैं), और यह एक से अधिक कमांड निष्पादित करने की अनुमति नहीं देता है (@_ की पूर्ण सामग्री तक पहुंचने के बजाय शिफ्ट का उपयोग दिया जाता है)।

कुछ निम्नलिखित की तरह अधिक समस्या के लिए उपयुक्त हो सकता है:

my @cmd = ('diff <(ls -l) <(ls -al)', 'grep fu'); 
my @stdout = exec_cmd(@cmd); 
print join("\n", @stdout); 

sub exec_cmd 
{ 
    my $cmd_str = join(' | ', @_); 
    my @result = qx(bash -c '$cmd_str'); 
    die "Failed to exec $cmd_str: $!" unless($? == 0 && @result); 
    return @result; 
} 

दुर्भाग्य से यह लागू/बिन से नहीं रोकेगी/बस बैश को चलाने के लिए श, हालांकि मैं नहीं करने के लिए एक समाधान देख पा रहे हैं इस मुद्दे।

+0

इस उत्तर में अधिक +1 क्यों नहीं हैं? – Mir

0

मैं बैकटिक्स में बैश कमांड को बैकटिक्स "" के साथ निष्पादित करना पसंद करता हूं। इस तरह से मैं एक वापसी मूल्य प्राप्त, उदा .:

my $value = \`ls`; 

इसके अलावा, मैं उपयोग करने के लिए "बैश -c" सिर्फ एक commmand चलाने के लिए नहीं है। मेरे लिये कार्य करता है।

0

@ errant.info से जवाब से प्रेरित होकर, मैं कुछ सरल बनाया है और मेरे लिए काम किया:

my $line="blastn -subject <(echo -e \"$seq1\") -query <(echo -e \"$seq2\") -outfmt 6"; 
my $result=qx(bash -c '$line'); 
print "$result\n"; 

शुरू की $ रेखाएं चर आदानों ($ seq1 और $ seq2) हर बार संशोधित अनुमति देता है। उम्मीद है कि यह मदद करता है!

संबंधित मुद्दे

 संबंधित मुद्दे