मेरे पास यह बैश स्क्रिप्ट है जिसका मैं उपयोग करता हूं i3wm
स्क्रीन मोड (बाहरी स्क्रीन, आंतरिक स्क्रीन, सभी या दर्पण) के बीच टॉगल करने के लिए। स्क्रिप्ट का पहला भाग स्क्रीन के नाम को पकड़ लेता है। यदि मैं एक टर्मिनल में निम्नलिखित भाग और रन की प्रतिलिपि बनाता हूं:
#!/bin/bash
xrandr|grep " connected primary"|IFS=" " read INTERNAL_OUTPUT con
xrandr|awk '/ connected/ && !/ primary/'|IFS=" " read EXTERNAL_OUTPUT con
echo internal monitor is $INTERNAL_OUTPUT
echo external monitor is $EXTERNAL_OUTPUT
...
मुझे कुछ मिलता है
$ ./script.sh
internal monitor is eDPI
external monitor is DPI-1
लेकिन जब मैं वास्तविक स्क्रिप्ट चलाता हूं, तो चर खाली होते हैं और मुझे जो दिखता है वह सब होता है
$ ./script.sh
internal monitor is
external monitor is
किसी स्क्रिप्ट के अंदर चर सेट करते समय क्या अंतर होता है?
xrandr|grep " connected primary"|{ IFS=" " read INTERNAL_OUTPUT con; echo internal monitor is $INTERNAL_OUTPUT; }
, और इसी तरह अन्य मॉनिटर के लिए। यह टर्मिनल और एक स्क्रिप्ट दोनों में काम करता है।
bash
, और आपका कंसोल नहीं है bash
(इसलिए वे वहां काम करते हैं) (क्या कहते हैं ls -l /proc/$$/exe
?) लेकिन आपकी स्क्रिप्ट को बैश (शेबंग के कारण) की आवश्यकता होती है इसलिए बैश नियमों का उपयोग करता है और इससे कोड विफल हो जाता है।
bash
, आपको कुछ चाहिए INTERNAL_OUTPUT=$(xrandr|grep " connected "|grep -o '^[^ ]*')
। यह बनाता है INTERNAL_OUTPUT
स्क्रिप्ट में बाद की लाइनों पर उपलब्ध है, हालांकि टर्मिनल पर लौटने पर नहीं जब तक कि साथ नहीं बुलाया जाता .
। यदि आप एक स्क्रिप्ट को चालू शेल में चर को कॉल किए बिना सेट करना चाहते हैं .
आपको इसे एक फंक्शन के रूप में कोड करना होगा।
echo
कमांड स्क्रिप्ट के समान ही हैंread
कमांड उन्हें काम करना चाहिए, लेकिन जब तक आप इसे नहीं कहते तब तक वे स्क्रिप्ट के बाहर काम नहीं करेंगे.
/source
आदेश।