/ / पर्ल: श: 1: सिंटैक्स त्रुटि: खराब एफडी संख्या - पर्ल

perl: sh: 1: सिंटेक्स त्रुटि: खराब एफडी संख्या - perl

मेरे पास एक बहुत ही सरल पर्ल स्क्रिप्ट है जो इस त्रुटि संदेश के साथ विफल है:

sh: 1: Syntax error: Bad fd number

यहाँ स्क्रिप्ट (दो लाइनें) है

#!/usr/bin/perl
system("xterm >& /dev/null &");

अगर मैं कमांड लाइन से समान xterm कमांड चलाता हूं, तो यह काम करता है। पर्ल स्क्रिप्ट से, यह "टी। क्या गलत है?"

उत्तर:

उत्तर № 1 के लिए 4
system(EXPR)

के लिए छोटा है[1]

system("/bin/sh", "-c", EXPR)

दूसरे शब्दों में, यह एक बोर्न शेल कमांड लेता है।

xterm >& /dev/null &

isn "t एक वैध बोर्न शेल कमांड। आप चाहते हैं

xterm >/dev/null 2>&1 &

हो सकता है कि आपने पर्ल के बाहर परीक्षण करने पर एक अलग शेल का इस्तेमाल किया हो।


  1. तकनीकी रूप से, यह करीब है

    use Config qw( );
    system($Config::Config{sh}, "-c", EXPR)
    

    सिवाय विंडोज में।


जवाब के लिए 2 № 2

सबसे पहले, बैश में stdout और stderr दोनों को पुनर्निर्देशित करने के लिए पसंदीदा वाक्यविन्यास है &>, नहीं >&, क्योंकि बाद को अन्य पुनर्निर्देशन रूपों के साथ भ्रमित किया जा सकता है।

दूसरे, system का उपयोग करता है /bin/sh जो आपके डिफ़ॉल्ट शेल से अलग तरीके से व्यवहार कर सकता है।

इसे स्पष्ट रूप से लिखने की कोशिश करें, जैसे कि

system("xterm >/dev/null 2>&1 &");

या खोल को पूरी तरह से छोड़ देना।

if (fork() == 0) {
open STDOUT, ">", "/dev/null";
open STDERR, ">&", *STDOUT;
exec "xterm";
POSIX::_exit();
}