$ ("/ Usr / sbin / sysctl -n hw.memsize") ऐसी कोई फ़ाइल या निर्देशिका नहीं


0

macOS हाई सिएरा, 10.13.3 (17D102)

  • अगर मैं टर्मिनल में चलता हूं sysctl -n hw.memsize यह ठीक काम करता है, मुझे एक नंबर मिलता है
  • अगर मैं दौड़ता हूँ which sysctl मुझे मिला /usr/sbin/sysctl जो सही लगता है

शेल स्क्रिप्ट से एक ही कमांड कैसे चलाएं? क्रॉस-ओएस समाधान की तलाश में। हर जगह शुद्ध श का उपयोग करना।

मैंने कोशिश की है:

#!/bin/sh
$("sysctl -n hw.memsize")
exit 1

1 परिणाम : पंक्ति 2: sysctl -n hw.memsize: कमांड नहीं मिली

#!/bin/sh
$("/usr/sbin/sysctl -n hw.memsize")
exit 1

2 परिणाम : पंक्ति 2: / usr / sbin / sysctl -n hw.memsize: ऐसी कोई फ़ाइल या निर्देशिका नहीं

#!/bin/sh
echo `sysctl -n hw.memsize`
exit 1

3 परिणाम : लाइन 2: 17179869184: कमांड नहीं मिला

निश्चित नहीं कि सही आउटपुट के बाद कमांड क्यों नहीं मिली।

#!/bin/sh
eval "sysctl -n hw.memsize"
exit 1

4 परिणाम : टर्मिनल में चलने के समान: 17179869184 लेकिन मैं eval से बचना चाहता हूँ।

जबकि चौथा उम्मीद के मुताबिक काम करता है, यह eval का उपयोग करता है और मैं इससे बचने की कोशिश करता हूं। 3rd लगभग सही लगता है और निश्चित नहीं है कि 2nd ऐसा क्यों नहीं कहता है जबकि यह मौजूद है।

sh स्क्रिप्ट फ़ाइल में + x chmod है।


1
अंदर उद्धरण का उपयोग न करें $(...)। यह पूरे उद्धृत स्ट्रिंग को कमांड के नाम के रूप में चलाने के लिए व्यवहार कर रहा है, क्योंकि, ठीक है, यही उद्धरण का मतलब है। यहाँ आपको जरूरत भी नहीं है $(...) हालाँकि, यदि आप एक सब-कमांड में कमांड चलाना चाहते हैं और एक स्ट्रिंग के रूप में इसके स्टडआउट को प्राप्त करना चाहते हैं
Eric Renouf

जवाबों:


3

वस्तुतः एक स्क्रिप्ट के अंदर एक ही कमांड होना चाहिए बिल्कुल वैसा ही :

sysctl -n hw.memsize

आपका प्रयास अधिक ध्यान केंद्रित करता है $(…) वाक्य रचना और मुझे नहीं पता क्यूं कर की जरूरत $(…) पहली जगह में। यदि आपको इसकी आवश्यकता है (जैसे कि परिणाम को एक चर में संग्रहित करें), तो यह ऐसा होना चाहिए

memsize=$(sysctl -n hw.memsize)

बिना उद्धरण के अंदर $(…)


$("sysctl -n hw.memsize")

1 परिणाम: line 2: sysctl -n hw.memsize: command not found

यह उद्धृत करने के कारण है। आपका शेल पूरे स्ट्रिंग को एक शब्द, एकल कमांड (निष्पादन योग्य) के रूप में चलाता है; जबकि आपका इरादा एक आदेश और दो तर्क पारित करना है। बिना उद्धरण के आपको मिलेगा command not found वैसे भी क्योंकि शेल मूल्यांकन करने की कोशिश करेगा (इस मामले में भागो) परिणाम भीतर की आज्ञा (यही है $(…) करता है), उदा। परिणाम हो सकता है 17179869184। वहाँ कोई नहीं 17179869184 आपके सिस्टम में कमांड है, है? इस पर ध्यान दें command not found जब आप उद्धरणों का उपयोग करते हैं, तो एक भिन्न स्तर से आएगा।

$("/usr/sbin/sysctl -n hw.memsize")

2 परिणाम: line 2: /usr/sbin/sysctl -n hw.memsize: No such file or directory

मूल रूप से ऊपर जैसा है। त्रुटि संदेश अलग-अलग होने के कारण / "कमांड" में, लेकिन तंत्र समान है।

echo `sysctl -n hw.memsize`

3 परिणाम: line 2: 17179869184: command not found

इस चाहिए काम (हालांकि यह भयानक कोड है)। क्या आपको यकीन है कि यह सिर्फ नहीं था `sysctl -n hw.memsize` के बिना echo? यह आपके 1 परिणाम के तहत समझाए गए "बिना उद्धरण के" मामले के समान होगा।

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