जब आप एक आदेश सूची को पुनर्निर्देशित करते हैं, जिसमें निष्पादन> / dev / null लगता है, तब भी लागू नहीं होता है, जैसे कि:
{ exec >/dev/null; } >/dev/null; echo "Hi"
"हाय" छपा है।
मैं इस धारणा के तहत था कि {}
जब तक यह एक पाइपलाइन का हिस्सा नहीं है, कमांड लिस्ट को एक उपधारा नहीं माना जाता है, इसलिए मुझे exec >/dev/null
अभी भी मेरे दिमाग में वर्तमान शेल पर्यावरण के भीतर लागू किया जाना चाहिए।
अब अगर आप इसे बदलेंगे:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
अपेक्षित रूप से कोई आउटपुट नहीं है; फ़ाइल डिस्क्रिप्टर 1 में भविष्य के कमांड के लिए / dev / null के रूप में अच्छी तरह से बताया गया है। यह फिर से दिखाया गया है:
{ exec >/dev/null; } >/dev/null; echo "Hi"
जो कोई आउटपुट नहीं देगा।
मैंने एक स्क्रिप्ट बनाने और इसे स्ट्रगल करने की कोशिश की, लेकिन मैं अभी भी अनिश्चित हूं कि यहां क्या हो रहा है।
इस स्क्रिप्ट के प्रत्येक बिंदु पर STDOUT फाइल डिस्क्रिप्टर का क्या हो रहा है?
संपादित करें: मेरा स्ट्रेस आउटपुट जोड़ना:
read(255, "#!/usr/bin/env bash\n{ exec 1>/de"..., 65) = 65
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
close(10) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
dup2(10, 1) = 1
fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(10) = 0
fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(1, TCGETS, 0x7ffee027ef90) = -1 ENOTTY (Inappropriate ioctl for device)
write(1, "hi\n", 3) = 3
;
के बाद }
जो के अर्थ बदल जाता है, > /dev/null
के लिए यौगिक सूची पर लागू नहीं {}
सब के बाद।
close(10)
। क्या आप अपनी संपूर्ण स्क्रिप्ट सामग्री भी पोस्ट कर सकते हैं, जिस पर आपने स्ट्रेस चलाया था?