เมื่อฉันพยายามเรียกใช้สคริปต์ที่มีคำสั่ง envsubst ฉันได้รับข้อผิดพลาดนี้ เมื่อดูทางออนไลน์ดูเหมือนว่าจะเป็นคำสั่ง bash มาตรฐานดังนั้นฉันไม่แน่ใจว่าจะติดตั้งอะไรเพื่อให้มันใช้งานได้
คำตอบ:
แก้ไข: anwer ของ @cobberboy ถูกต้องกว่า โหวตให้เขา
brew install gettext
brew link --force gettext
ต่อไปนี้เป็นคำตอบเก่าของฉัน:
envsubst
รวมอยู่ในgettext
แพ็คเกจ
ดังนั้นคุณอาจรวบรวมมันด้วยตัวคุณเองโดยใช้เครื่องมือสร้างมาตรฐานเช่นหรือใช้make
homebrew
อย่างไรก็ตามดูเหมือนว่าจะมีปัญหาเล็กน้อยเมื่อติดตั้งgettext
ใน MacOS ดูรายละเอียด url ต่อไปนี้: วิธีติดตั้ง gettext บน MacOS X
envsubst
จะเป็นส่วนหนึ่งของ gettext (ตามที่ติดตั้งโดย homebrew) จะไม่เชื่อมโยงโดยค่าเริ่มต้น ฉันคาดหวังว่านี่เป็นเพราะ gettext เป็นสูตรถังเท่านั้น คุณสามารถบอก homebrew ให้เชื่อมโยงถังได้ แต่อาจมีผลข้างเคียงที่ไม่ได้ตั้งใจ วิธีการล่วงล้ำน้อยในการติดตั้งนามแฝงโดยการเพิ่มalias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
ที่คุณ.profile
(หรือเทียบเท่า) แน่นอนคุณอาจติดตั้ง gettext เวอร์ชันอื่นไว้ brew info gettext
คุณสามารถเรียนรู้เกี่ยวกับเรื่องนี้โดยการเรียกใช้
/usr/local/opt/gettext/bin/envsubst
ซึ่งมีชีวิตอยู่การอัพเกรด
brew install gettext
brew link --force gettext
สิ่งนี้จะเปิดใช้งาน envsubst บน OS X และบังคับให้เชื่อมโยงอย่างถูกต้อง ต้องติดตั้ง homebrew
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 symlinks?
gettext
รวมถึงเรื่องมากมาย; ดูเหมือนว่าจะenvsubst
ติดตั้งมากเกินไป แต่เป็นวิธีที่เร็วและง่ายที่สุด
เพื่อขจัดความสับสนที่อาจเกิดขึ้น:
envsubst
เป็นภายนอกปฏิบัติการและทำให้ส่วนหนึ่งไม่ได้ทุบตี ; ไฟล์ปฏิบัติการภายนอกขึ้นอยู่กับแพลตฟอร์มทั้งในแง่ของสิ่งที่พร้อมใช้งานตลอดจนพฤติกรรมเฉพาะและตัวเลือกเฉพาะที่รองรับ (แม้ว่าหวังว่าจะมีชุดย่อยทั่วไปตามข้อกำหนดของ POSIX)bash
ที่เรียกว่าbuiltinsและมีเพียงพวกเขาสามารถพึ่งพาอาศัยเพื่อจะนำเสนอในทุกแพลตฟอร์มหากต้องการทดสอบว่าคำสั่งที่กำหนดเป็นแบบ builtin หรือไม่ให้ใช้
type <cmdName>
ในกรณีที่อยู่ในมือการทำงานtype envsubst
บน macOS 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
ตอนนี้ฉันใช้สิ่งนี้ในสคริปต์ทุบตีของฉันที่ต้องใช้ 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
"
ประมาณ $ line แต่ฉันยังไม่ได้ลอง
หากคุณไม่ต้องการรบกวนการติดตั้ง homebrew และ gettext ไฟล์ปฏิบัติการ perl หนึ่งบรรทัดจะทำ:
#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
envsubst
รวมอยู่ในgettext
แพ็คเกจ คุณอาจรวบรวมด้วยตัวคุณเอง ดูstackoverflow.com/questions/14940383/…