envsubst: Mac OS X 10.8 पर कमांड नहीं मिला


92

जब मैं एक स्क्रिप्ट चलाने की कोशिश करता हूं जिसमें एन्वाबस्ट कमांड होता है, तो मुझे यह त्रुटि मिलती है। ऑनलाइन देखते हुए, यह एक मानक बैश कमांड लगता है, इसलिए मुझे यह सुनिश्चित नहीं है कि इसे काम करने के लिए क्या स्थापित करना है।


2
envsubstgettextपैकेज में शामिल है । आप अपने हिसाब से संकलन कर सकते हैं। देखें stackoverflow.com/questions/14940383/…
ymonad

एक उत्तर के रूप में जोड़ना चाहते हैं ताकि मैं इसे स्वीकार कर सकूं?
एंड्रयू

मैंने इसे उत्तर के रूप में पोस्ट किया।
योनमाड

जवाबों:


131

संपादित करें: @ cobberboy का एवर अधिक सही है। उसे उभारना।

brew install gettext
brew link --force gettext 

निम्नलिखित मेरा पुराना उत्तर है:

envsubstgettextपैकेज में शामिल है ।

इसलिए आप मानक निर्माण उपकरण जैसे कि makeया का उपयोग करके इसे अपने द्वारा संकलित कर सकते हैं homebrew

हालाँकि, ऐसा प्रतीत होता है कि gettextMacOS में इंस्टॉल करते समय यह बहुत कम समस्या है । विवरण के लिए निम्नलिखित यूआरएल देखें: मैकओएस एक्स पर गेटटेक्स्ट कैसे स्थापित करें


8
जबकि envsubstगेटटेक्स्ट का हिस्सा है (जैसा कि होमब्रे द्वारा स्थापित किया गया है) यह डिफ़ॉल्ट रूप से जुड़ा नहीं है। मुझे उम्मीद है कि यह है क्योंकि gettext एक केग-केवल सूत्र है। आप होमब्रे को केग को लिंक करने के लिए कह सकते हैं, लेकिन इसके अनजाने दुष्प्रभाव हो सकते हैं। एक कम घुसपैठ दृष्टिकोण alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'आपके .profile(या समकक्ष) में जोड़कर एक उपनाम स्थापित करना है । बेशक, आपके पास गेटटेक्स्ट का एक और संस्करण स्थापित हो सकता है। आप इसके बारे में जानकर दौड़ सकते हैं brew info gettext
त्रिकोणीय

2
@trkoch आप शायद उर्फ /usr/local/opt/gettext/bin/envsubstको जीवित करना चाहते हैं जो उन्नयन से बचता है
क्रिस्टोफ़ हॉसलर

1
हालांकि यह स्वीकृत उत्तर है, कृपया नीचे @ cobberboy के उत्तर को स्क्रॉल करें, क्योंकि यह भी एक आम बात है कि आपको लिंक को बाध्य करने की आवश्यकता है।
बिग मनी

मुझे आश्चर्य हुआ कि मैं अचानक क्यों ज्यादा परेशान हो रहा था। आपकी उदारता के लिए धन्यवाद @ymonad
cobberboy

1
/Usr/local/Cellar/gettext/0.19.8.1 को लिंक कर रहा है ... 194 सिमिलिंक बनाए गए ... wtf 194 सिमिलिंक?
अलेक्जेंडर मिल्स

235
brew install gettext
brew link --force gettext 

यह ओएस एक्स पर एन्वसबस्ट को सक्षम करेगा, और इसे ठीक से लिंक करने के लिए मजबूर करेगा। इसे स्थापित करने के लिए होमब्रे की आवश्यकता होती है।


1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 सहानुभूति?
अलेक्जेंडर मिल्स

@AlexanderMills हाँ gettextबहुत सारे सामान का एक नरक भी शामिल है; यह सिर्फ envsubstस्थापित करने के लिए ओवरकिल की तरह लगता है, लेकिन यह सबसे तेज और सरल तरीका है।
कोबर्बॉय

ऐसा लगता है जैसे वे हर फाइल को सिंपल करने के बजाय सिर्फ एक फोल्डर में सिमिंक कर रहे हैं
अलेक्जेंडर मिल्स

17

संभावित भ्रम को दूर करने के लिए:

  • envsubstएक बाहरी निष्पादन योग्य है और इस प्रकार बैश का हिस्सा नहीं है ; बाहरी निष्पादनयोग्य प्लेटफ़ॉर्म-निर्भर हैं , दोनों के संदर्भ में जो उनके विशिष्ट व्यवहार के साथ-साथ उपलब्ध हैं और विशिष्ट विकल्प जो वे समर्थन करते हैं (हालांकि, उम्मीद है, POSIX विनिर्देशों के आधार पर एक आम उपसमुच्चय है)
  • सीधे बनाए गए कमांड bashको बिलिन कहा जाता है , और केवल उन्हें सभी प्लेटफार्मों पर उपस्थित होने पर भरोसा किया जा सकता है

यह जांचने के लिए कि क्या दिया गया कमांड एक बिलिन है , उपयोग करें

type <cmdName>

मामले में, type envsubstmacOS 10.13 रिटर्न पर चल रहा है -bash: type: envsubst: not found, जिसमें से आप अनुमान लगा सकते हैं:

  • envsubst बिल्टिन नहीं है
  • envsubstआपके सिस्टम में नहीं है $PATH(और इस तरह आपके सिस्टम पर मौजूद नहीं है)

(इसके विपरीत, आदेश पर समान चल रहा है, उदाहरण के लिए, एक Ubuntu 12.04 सिस्टम रिटर्न करता है envsubst is hashed (/usr/bin/envsubst), जो आपको बताता है कि उपयोगिता मौजूद है और यह कहां स्थित है।)


एक अस्थायी विकल्प का envsubstउपयोग करना है eval, हालांकि सामान्य चेतावनी लागू होती है: evalकेवल उन तारों पर उपयोग करें जिनकी सामग्री आप नियंत्रित करते हैं या विश्वास करते हैं:

sample.txtफ़ाइल को अनपेक्षित चर चर संदर्भों के साथ पाठ मान लें ; उदाहरण के लिए:

cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF

के बराबर:

envsubst < sample.txt

है:

eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""

हालांकि, एक महत्वपूर्ण अंतर है :

  • envsubstकेवल पर्यावरण चर संदर्भ का विस्तार करता है
  • जबकि शेल चर संदर्भों का भीeval विस्तार होगा - साथ ही एम्बेडेड कमांड प्रतिस्थापन , जो एक सुरक्षा चिंता का उपयोग करता है।eval

मुझे इसका विचार पसंद है eval echoक्योंकि मुझे स्रोत पर भरोसा है लेकिन यह समान नहीं है .. envsubst < .env.exampleबस नहीं हो सकता हैeval echo < .env.example
iRaS

1

मैं अब इसका उपयोग अपने bash स्क्रिप्ट में कर रहा हूँ जिसमें envsubst की आवश्यकता है:

if ! which envsubst > /dev/null 2>&1; then
    envsubst() {
        while read line; do
            line=$( echo $line | sed 's/"/\\"/g' )
            eval echo $line
        done
    }
fi

आप इसे envsubst कमांड के रूप में उपयोग कर सकते हैं - बेशक यह पूर्ण या कुछ और नहीं है:

envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt

यह सभी प्रमुख और अनुगामी व्हाट्सएप को अलग करने के लिए लगता है
सूडो

जैसा कि कहा गया है कि यह एक वर्कअराउंड है जो पूर्ण नहीं है। आप "लगभग $ लाइन जोड़ने की कोशिश कर सकते हैं लेकिन मैंने अभी तक यह कोशिश नहीं की है
iRaS

1

यदि आप होमब्रे और गेटटेक्स्ट को स्थापित करने में परेशान नहीं करना चाहते हैं, तो एक लाइन पर्ल निष्पादन योग्य होगी:

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.