envsubst: ম্যাক ওএস এক্স 10.8-তে কমান্ড পাওয়া যায় নি


92

যখন আমি একটি স্ক্রিপ্ট চালানোর চেষ্টা করি যেখানে এনভসুবস্ট কমান্ডটি থাকে তখন আমি এই ত্রুটিটি পাই। অনলাইনে সন্ধান করা, এটি একটি স্ট্যান্ডার্ড বাশ কমান্ড বলে মনে হচ্ছে, তাই এটি কাজ করার জন্য কী ইনস্টল করবেন তা আমি নিশ্চিত নই।


4
envsubstgettextপ্যাকেজ অন্তর্ভুক্ত করা হয় । আপনি নিজের দ্বারা সংকলন করতে পারেন। দেখতে stackoverflow.com/questions/14940383/...
ymonad

একটি উত্তর হিসাবে এটি যুক্ত করতে চান যাতে আমি এটি গ্রহণ করতে পারি?
অ্যান্ড্রু

আমি উত্তর হিসাবে পোস্ট।
ymonad

উত্তর:


131

সম্পাদনা করুন: @ কোবারবয়ের অ্যাওয়ার আরও সঠিক more তাকে উত্সাহিত করুন।

brew install gettext
brew link --force gettext 

নিম্নলিখিতটি আমার পুরানো উত্তর:

envsubstgettextপ্যাকেজ অন্তর্ভুক্ত করা হয় ।

অতএব আপনি স্ট্যান্ডার্ড বিল্ড সরঞ্জাম যেমন makeব্যবহার বা ব্যবহার করে এটি নিজের দ্বারা সংকলন করতে পারেন homebrew

তবে gettextম্যাকওএসে ইনস্টল করার সময় এটি খুব কম সমস্যা বলে মনে হচ্ছে । বিশদগুলির জন্য নিম্নলিখিত url দেখুন: ম্যাকস এক্স এ গেটটেক্সট কীভাবে ইনস্টল করবেন


8
যদিও envsubstগেটেক্সটেক্সের অংশ (যেমন হোমব্রিউ দ্বারা ইনস্টল করা হয়েছে) এটি ডিফল্টরূপে লিঙ্কযুক্ত নয়। আমি এটি প্রত্যাশা করি কারণ গেটেক্সটেক্সটি কেবল একটি কেবল-র সূত্র। আপনি হোমগ্রাবকে কেজটি লিঙ্ক করতে বলতে পারেন, তবে এতে অনিচ্ছাকৃত পার্শ্ব-প্রতিক্রিয়া থাকতে পারে। alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'আপনার .profile(বা সমমানের) সাথে যুক্ত করে একটি উপনাম সেটআপ করা হ'ল কম অনুপ্রেরণীয় পন্থা । অবশ্যই, আপনার গেটেক্সটেক্সের আরও একটি সংস্করণ ইনস্টল থাকতে পারে। দৌড়ে আপনি এটি সম্পর্কে শিখতে পারেন brew info gettext
trkoch

4
@trkoch আপনি সম্ভবত উপন্যাসটি চান /usr/local/opt/gettext/bin/envsubstযা আপগ্রেডগুলিতে বেঁচে থাকবে
ক্রিস্টোফ হসলার

4
যদিও এটি গৃহীত উত্তর, দয়া করে @ কোবারবয়ের উত্তরটি নীচে স্ক্রোল করুন, কারণ এটি সম্ভবত একটি সাধারণ কারণ আপনাকে লিঙ্কটি জোর করা দরকার।
বড় অর্থ

আমি ভাবছিলাম কেন হঠাৎ করে আরও বেশি উত্সাহ পাচ্ছি। আপনার উদারতা @ ইয়মনাডের জন্য ধন্যবাদ
কোবারবয়

4
লিঙ্কিং / ওশর / লোকাল / সেলার / বাজেটেক্সট/0.19.8.1 ... 194 টি সিমলিংক তৈরি করা হয়েছে ... wtf 194 টি সিমলিংক?
আলেকজান্ডার মিলস

235
brew install gettext
brew link --force gettext 

এটি ওএস এক্স-তে এনভসবস্টকে সক্ষম করবে এবং এটিকে সঠিকভাবে লিঙ্ক করতে বাধ্য করবে। এটি হোমব্রু ইনস্টল করা প্রয়োজন।


4
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 টি symlinks?
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস হ্যাঁ প্রচুর স্টাফের নরককে gettextঅন্তর্ভুক্ত করেছে; মনে হচ্ছে কেবল envsubstইনস্টল করা ওভারকিলের মতো তবে এটি দ্রুত এবং সহজতম উপায়।
কোবারবয়

দেখে মনে হচ্ছে যে তারা কেবল একটি ফোল্ডারকে সিমলিংক করার পরিবর্তে প্রতিটি ফাইল সিলেট করছে
আলেকজান্ডার মিলস

17

সম্ভাব্য বিভ্রান্তি দূর করতে:

  • envsubstএকটি বাহ্যিক সম্পাদনযোগ্য এবং এটি বাশের অংশ নয় ; বাহ্যিক এক্সিকিউটেবলগুলি প্ল্যাটফর্ম-নির্ভর , উভয় ক্ষেত্রে যা তাদের জন্য উপলব্ধ রয়েছে সেই সাথে তাদের নির্দিষ্ট আচরণ এবং তারা যে সুনির্দিষ্ট বিকল্পগুলি সমর্থন করে তাদের উভয় ক্ষেত্রেই (যদিও আশা করি, পসিক্সের নির্দিষ্টকরণের ভিত্তিতে একটি সাধারণ উপসেট রয়েছে)
  • কমান্ড সরাসরি পাতাটা bashবলা হয় builtins , এবং শুধুমাত্র তারা উপর নির্ভরশীল করা যেতে পারে উপস্থিত হতে সব প্ল্যাটফর্মের

প্রদত্ত কমান্ডটি অন্তর্নির্মিত কিনা তা পরীক্ষা করতে , ব্যবহার করুন

type <cmdName>

হাতের ক্ষেত্রে, type envsubstম্যাকোস 10.13 রিটার্নে চলছে -bash: type: envsubst: not found, যা থেকে আপনি অনুমান করতে পারেন:

  • envsubst একটি অন্তর্নির্মিত না
  • envsubstআপনার সিস্টেমের মধ্যে নেই $PATH(এবং সম্ভবত এটি সম্ভবত আপনার সিস্টেমে উপস্থিত হবে না)

(বিপরীতে, একই কমান্ড চালু করে, উদাহরণস্বরূপ, একটি উবুন্টু 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.exampleeval echo < .env.example
উত্সটিতে

1

আমি এটি এখন আমার বাশ স্ক্রিপ্টে ব্যবহার করছি যার জন্য এনভ্যুবসবস্ট প্রয়োজন:

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 <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt

এটি সমস্ত নেতৃস্থানীয় এবং অনুসরণযোগ্য শ্বেত স্পেসটি ছিনিয়ে নেবে বলে মনে হচ্ছে
su

যেমনটি বলা হয়েছে যে এটি সম্পূর্ণরূপে বৈশিষ্ট্যযুক্ত নয় এমন একটি কাজ। আপনি "প্রায় $ লাইন যুক্ত করার চেষ্টা করতে পারেন তবে আমি এটি এখনও চেষ্টা করি নি
আইআরএস

1

আপনি যদি হোমব্রিউ এবং গেটটেক্সট ইনস্টল করতে বিরত না করতে চান তবে এক্সিকিউটেবল একটি লাইনের পার্ল এটি করবে:

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.