POSIX परीक्षण और -a


9

मैंने चेकबेशिज्म के साथ मेरी एक स्क्रिप्ट की जाँच की और मुझे निम्न चेतावनी मिली:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

में POSIX चश्मा की धारा 4.62.4 मुझे लगता है

प्राइमरी-ए प्राइमरी एक बाइनरी करता है और प्राइमरी और प्राइमरी का रिजल्ट। -A ऑपरेटर -o ऑपरेटर पर पूर्वता रखता है।

क्यों कर रहे हैं -aऔर -oमाना जाता है गैर पोर्टेबल?

जवाबों:


11

यह इतना नहीं है कि यह पोर्टेबल नहीं है, लेकिन यह कोई [कार्यान्वयन नहीं है जहां यह विश्वसनीय है जब 4 से अधिक तर्क पारित किए जाते हैं।

यहां तक ​​कि बैश में:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

संबंधित अनुभाग बताता है:

> 4 तर्क :

परिणाम अनिर्दिष्ट हैं।

[OB XSI] [विकल्प प्रारंभ] XSI-अनुरूप सिस्टम पर, प्राथमिकताओं और ऑपरेटरों के संयोजन का मूल्यांकन पहले से वर्णित पूर्ववर्तीता और सहानुभूति नियमों का उपयोग करके किया जाएगा। इसके अलावा, स्ट्रिंग तुलना बाइनरी प्राइमरी '=' और "! =" की तुलना में किसी भी प्राथमिक प्राथमिक से अधिक होगी। [विकल्प समाप्ति]

-aऔर -oप्रतिबंधित किया जाना चाहिए। सही तरीके से उपयोग करने के लिए है &&और || शेल ऑपरेटरों के बजाय:

if [ -n "$foo" ] && [ -n "$bar" ]; then

मैं इसे और अधिक सुपाठ्य पाता हूं।


धन्यवाद, तो दो परीक्षणों के लिए एकमात्र समाधान होगा? `अगर [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
मैटो

3
नहीं केवल एक लेकिन निश्चित रूप से सबसे अच्छा है और के लिए एक स्थानापन्न के रूप में सिफारिश -aऔर-o
स्टीफन Chazelas

ठीक है बहुत धन्यवाद (केवल मेरा मतलब है कि एक ही परीक्षण करने का कोई तरीका नहीं है ...)।
मत्तो

1
हाँ, आप कर सकते हैं [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](अभी भी पोसिक्स के अनुसार अनिर्दिष्ट लेकिन पोर्टेबल और विश्वसनीय), या[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
स्टीफन चेज़लस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.