स्क्रिप्ट वितरित करना: क्या मुझे शबंग के लिए बिन / गॉव या / usr / बिन / गॉव का उपयोग करना चाहिए?


12

आमतौर पर / बिन या usr / बिन में gawk है? मैं साथ जाऊंगा #!/usr/bin/env gawkलेकिन फिर मैं तर्कों का उपयोग नहीं कर सकता। अभी मैं उपयोग कर रहा हूं #!/bin/gawk -f। स्क्रिप्ट बहुत लंबी है और इसमें बहुत सारे उद्धरण हैं और स्टड के साथ काम करता है।

GNU Awk मैनुअल में खंड 1.1.4 निष्पादन योग्य awk प्रोग्राम हैं, जहां यह अपने उदाहरण में #! / Bin / awk का उपयोग करता है, लेकिन यह कहता है:

ध्यान दें कि इसके बजाय कई सिस्टम awkमिल सकते हैं । कैविएट एमप्टर।/usr/bin/bin

ज्यादातर लोग क्या करते हैं? मैंने पढ़ा है कि sed को कथित रूप से / बिन में मानकीकृत किया गया है, जबकि perl को / usr / bin में समान रूप से मानकीकृत किया गया है (उसी पृष्ठ को sed लिंक के रूप में, लेकिन वे मुझे इस पोस्ट के लिए तीसरा लिंक नहीं बनाने देंगे)। Awk / gawk के बारे में क्या? क्या कोई जानता है कि कौन अधिक सामान्य या लोकप्रिय है?


आप क्यों इस्तेमाल करते हैं -f? /bin/gawkपर्याप्त नहीं है? इसके अलावा, यह प्रासंगिक हो सकता है।
terdon

जवाबों:


7

शेबंग उस लचीले होने का मतलब नहीं था । कुछ मामले हो सकते हैं जहां एक दूसरा पैरामीटर काम करता है , मुझे लगता है कि FreeBSD उनमें से एक है।

gawk और OS के साथ आने वाली अधिकांश उपयोगिताओं में होने की उम्मीद है /usr/bin/

पुराने UNIX दिनों में, /usr/स्थानीय डिस्क स्थान और लागत प्रति कार्य केंद्र को बचाने के लिए NFS या कुछ कम महंगे मीडिया पर घुड़सवार होना आम बात थी । एकल उपयोगकर्ता मोड/bin/ में बूट करने के लिए आवश्यक सब कुछ होना चाहिए था । चूंकि एक विश्वसनीय मीडिया पर मुहिम शुरू नहीं की गई थी, इसलिए सामान्य प्रशासन और समस्या निवारण के लिए इसे अनुकूल बनाने के लिए पर्याप्त उपयोगिताओं को शामिल किया गया था।/usr//bin/

यह शुरुआत में लिनक्स में विरासत में मिला था, लेकिन चूंकि डिस्क स्थान अब कोई समस्या नहीं है और ज्यादातर मामलों /usr/में रूट फाइल सिस्टम में है, वर्तमान प्रवृत्ति सब कुछ /usr/bin(कम से कम लिनक्स की दुनिया में) स्थानांतरित करने के लिए है । इसलिए एक डिस्ट्रो द्वारा स्थापित अधिकांश उपयोगिताओं को वहां पाए जाने की उम्मीद है। यहां तक कि सबसे बुनियादी उपयोगिताओं, जैसे cp, rm, lsआदि (ठीक है, अभी तक नहीं)।

शेबंग पसंद के बारे में। परंपरागत रूप से, यह कुछ ऐसा है जो उपयोगकर्ताओं या उपयोगकर्ताओं को अपने वातावरण के अनुसार संपादित करना होगा। सभी डेवलपर जानते हैं, अन्य लोगों के सिस्टम में, दुभाषिया फाइलसिस्टम में कहीं भी हो सकता है (जैसे /usr/local/bin, /opt/gawk-4.0.1/bin)। उचित रूप से पैक की गई स्क्रिप्ट (आरपीएम, डिब आदि) या तो एक डिस्ट्रो पैकेज पर निर्भरता के साथ आती हैं (यानी दुभाषिया का एक ज्ञात स्थान है) या एक कॉन्फ़िगर स्क्रिप्ट जो स्थापना के दौरान उचित हैशबंग को सेटअप करती है।


14

यदि आपको कमांड में तर्क पारित करने की आवश्यकता नहीं #!/usr/bin/env gawkहै, तो जाने का रास्ता है, लेकिन कई कर्नेल (लिनक्स सहित) केवल एक तर्क को शेल्हांग कार्यक्रमों के लिए स्वीकार करते हैं।

अन्यथा, आप एक पॉलीग्लॉट प्रोग्राम बना सकते हैं जो शेल आवरण और awk स्क्रिप्ट दोनों है। यहां जागने के लिए एक है।

#!/bin/sh
true + /; exec gawk -f "$0"; exit; / {}
# awk script starts here

शेल पार्सिंग:

  • true + /;- कमांड true(जो कुछ भी नहीं करता है) दो निष्क्रिय तर्क +और के साथ /
  • के लिए कॉल gawk। यह कोई भी शेल स्निपेट हो सकता है जिसमें नई-नई पंक्तियाँ नहीं होती हैं और जहाँ स्लैश लिखे जाते हैं \/(शेल में उद्धरणों को छोड़कर दिमाग नहीं होता है)।
    कॉल का उपयोग execगॉव को एक उपप्रकार के रूप में निष्पादित करने के बजाय शेल को बदलने के लिए करता है।
  • exit;- शेल से बाहर निकलने के मामले में, गौक नहीं मिला। उसके बाद किसी भी चीज को नजरअंदाज कर दिया जाता है, सिवाय इसके कि यह वैध शेल सिंटैक्स होना चाहिए अगर शेल इसे निष्पादित करने के लिए शुरू करने से पहले पूरी लाइन को पार्स करने की कोशिश करता है।

अर्क पार्सिंग:

  • स्लैश के बीच बिट एक नियमित अभिव्यक्ति है।
  • true + /REGEX/- एक शर्त। trueएक अपरिभाषित चर है, इसलिए इसका संख्यात्मक मान 0 है, यह मायने नहीं रखता है।
  • {} - अगर कहा जाए कि शर्त रखी जाए, तो कुछ न करें।

5

गिल्स का प्रस्तावित समाधान वास्तव में एक बहुत अच्छा दृष्टिकोण है (अंत में उनकी पोस्ट में मतदान करने की प्रतिष्ठा है :))।

किसी भी मामले में, जहां तक ​​मैं execकमांड को समझता हूं , exitयह अनावश्यक, वास्तव में अगम्य के बाद अधिकार बनाता है , क्योंकि शेल प्रक्रिया द्वारा प्रतिस्थापित किया जाता है awk

इसके अलावा, awkस्क्रिप्ट को अपने मंगलाचरण मापदंडों का उपयोग करने की अनुमति देने के लिए, मैं प्रस्तावित समाधान में कुछ बदलाव सुझाऊंगा:

#!/bin/sh
true + /; exec -a "$0" gawk -f "$0" -- "$@"; / {}
# awk script starts here

-a "$0"इसके मंगलाचरण नाम का उपयोग करने की अनुमति देता है स्क्रिप्ट, अन्यथा यह हमेशा मिल जाएगा एक awkया gawkजब तक पहुँचने ARGV[0]चर। इसी तरह, "$@"स्क्रिप्ट को ARGV[1...N]सरणी में शेष मापदंडों तक पहुंचने की --अनुमति देता है और पूर्ववर्ती यह स्क्रिप्ट को -<something>बिना gawk की व्याख्या के तर्क प्राप्त करने की अनुमति देता है उन्हें इसके लिए अभिप्रेत है।

याद रखने / विचार करने के लिए एक exit(0);बात स्क्रिप्ट प्रोग्राम के BEGIN { ... }ब्लॉक के अंत में एक स्टेटमेंट जोड़ना है awk, अन्यथा awkइनपुट फाइल के रूप में स्क्रिप्ट को दिए गए सभी मापदंडों को खतरा होगा। (कृपया ध्यान दें कि इसका कोई लेना-देना नहीं है, इस exitकथन के साथ हमने true + ...लाइन से हटा दिया , यह एक अप्राप्य शेल स्टेटमेंट था जबकि यह सुझाव दिया गया था कि बाहर निकलना कोड है)।


exit(0)बहुत उपयोगी था! इसके अलावा, मैकोस उपयोगकर्ताओं के लिए, यह देख लें: एक अच्छा पोर्टेबल शेख शबंग को ढूंढना आसान नहीं है।
सीमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.