"अगर tty -s" काम करता है, लेकिन "if [tty -s]" क्यों नहीं करता है?


0

ध्यान दें, मैं kshCentOS में उपयोग और चल रहा हूं ।

मेरे पास एक शेल स्क्रिप्ट है जहां एक लकड़हारा फ़ंक्शन सेट है:

if tty -s
then
  echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
  echo "${FOO}" >> ${BAR_LOG_FILE} 
fi

मेरा प्रश्न यह है कि जब मैंने अपने कोड में ifअन्य सभी ifपरीक्षणों की तरह यह देखने के लिए इसे तैयार किया, तो इसने कार्य करना बंद कर दिया।

क्यों?

मेरा रिफ्लेक्टर इस प्रकार था:

if [ tty -s ];
then
  echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
  echo "${FOO}" >> ${BAR_LOG_FILE} 
fi

मेरा एकमात्र परिवर्तन मेरे बाकी परीक्षणों की तरह, चारों ओर कोष्ठक लगाना ifऔर जोड़ना था , जो सभी उद्देश्य के अनुसार काम करते हैं।;if

मेरे रिफ्लेक्टर में एक त्रुटि हुई, जो ऐसा लग रहा था जैसे BAR_LOG_FILEपाया नहीं जा सकता।

यहाँ क्या चल रहा है?


1
क्या डाउनवोट्स को समझाया जा सकता है? मैं परीक्षण से निपटने वाले अन्य पदों को खोजने में सक्षम था, लेकिन जब तक आपको एहसास नहीं होता है कि [एक परीक्षण के लिए एक वाक्यविन्यास और वाक्यविन्यास नहीं है, तो इस प्रकार के प्रश्न से भ्रमित न होना कठिन होगा। और वहाँ से जो मैं बता सकता हूं, कोई उपयुक्त संदर्भ नहीं है जो इसे समझाता है क्योंकि यह ट्टी से संबंधित है।
एंटोन रासमुसेन

जवाबों:


5

वर्ग कोष्ठक के बाद ifवाक्य रचना जो लोप किया जा सकता है या शैलीगत वरीयताओं पर निर्भर नहीं शैल नहीं कर रहे हैं, वे एक अलग आदेश कर रहे हैं test। (लिंक किए गए मैनपेज में बाहरी test/ [कमांड का वर्णन है , लेकिन कई गोले अपना स्वयं का कार्यान्वयन प्रदान करते हैं।)

लिख रहे हैं

if [ tty -s ];

लिखने के बराबर है

if test tty -s;

और चूंकि test/ [एक ttyऑपरेटर नहीं है , यह विफल रहता है।

ifएक कमांड का पालन किया जाता है, जो इसे चलाता है, और उस कमांड का एग्जिट कोड निर्धारित करता है कि किस शाखा को लिया गया है if: यदि यह 0 है, तो thenशाखा को लिया जाता है, अन्यथा, elseशाखा (यदि कोई हो)।


ठीक। यह समझ में आता है कि मेरे सभी अन्य ifआदेशों का पालन झंडे द्वारा किया जाता है (उदाहरण के लिए -f, -sऔर आदेश नहीं) और क्यों वे इरादा के अनुसार काम करते हैं।
एंटोन रासमुसेन

3
आपके अन्य ifकथनों का पालन ​​एक कमांड द्वारा किया जाता है, [कमांड, और -f, -sआदि के तर्क हैं [
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.