मेरे पास एक बहुत ही सरल पर्ल स्क्रिप्ट है जो इस त्रुटि संदेश के साथ विफल है:
sh: 1: Syntax error: Bad fd number
यहाँ स्क्रिप्ट (दो लाइनें) है
#!/usr/bin/perl
system("xterm >& /dev/null &");
अगर मैं कमांड लाइन से समान xterm कमांड चलाता हूं, तो यह काम करता है। पर्ल स्क्रिप्ट से, यह "टी। क्या गलत है?"
उत्तर:
उत्तर № 1 के लिए 4system(EXPR)
के लिए छोटा है[1]
system("/bin/sh", "-c", EXPR)
दूसरे शब्दों में, यह एक बोर्न शेल कमांड लेता है।
xterm >& /dev/null &
isn "t एक वैध बोर्न शेल कमांड। आप चाहते हैं
xterm >/dev/null 2>&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();
}