Khi tôi cố gắng chạy tập lệnh có chứa lệnh envsubst, tôi gặp lỗi này. Nhìn trên mạng, đây có vẻ là một lệnh bash tiêu chuẩn, vì vậy tôi không chắc phải cài đặt những gì để nó hoạt động.
Khi tôi cố gắng chạy tập lệnh có chứa lệnh envsubst, tôi gặp lỗi này. Nhìn trên mạng, đây có vẻ là một lệnh bash tiêu chuẩn, vì vậy tôi không chắc phải cài đặt những gì để nó hoạt động.
Câu trả lời:
Chỉnh sửa: Anwer của @cobberboy thì đúng hơn. ủng hộ anh ấy.
brew install gettext
brew link --force gettext
Sau đây là câu trả lời cũ của tôi:
envsubstđược bao gồm trong gettextgói.
Do đó, bạn có thể tự biên dịch nó bằng cách sử dụng các công cụ xây dựng tiêu chuẩn như makehoặc sử dụng homebrew.
Tuy nhiên, nó dường như gặp ít vấn đề khi cài đặt gettexttrong MacOS. Xem url sau để biết chi tiết: Cách cài đặt gettext trên MacOS X
envsubstlà một phần của gettext (được cài đặt bởi homebrew), nó không được liên kết theo mặc định. Tôi mong đợi điều này là vì gettext là một công thức chỉ keg. Bạn có thể nói với homebrew để liên kết thùng, nhưng điều này có thể có tác dụng phụ ngoài ý muốn. Một cách tiếp cận ít xâm phạm hơn là thiết lập bí danh bằng cách thêm alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'vào .profile(hoặc tương đương) của bạn. Tất nhiên, bạn có thể đã cài đặt một phiên bản gettext khác. Bạn có thể tìm hiểu về nó bằng cách chạy brew info gettext.
/usr/local/opt/gettext/bin/envsubstmà sống sót nâng cấp
brew install gettext
brew link --force gettext
Điều này sẽ kích hoạt envsubst trên OS X và buộc nó phải liên kết đúng cách. Nó yêu cầu phải cài đặt homebrew.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 liên kết tượng trưng?
gettextbao gồm rất nhiều thứ; Nó có vẻ như quá mức cần thiết chỉ để envsubstcài đặt nhưng đó là cách nhanh nhất và đơn giản nhất.
Để giải tỏa sự nhầm lẫn tiềm ẩn:
envsubstlà một tệp thực thi bên ngoài và do đó không phải là một phần của Bash ; các tệp thực thi bên ngoài phụ thuộc vào nền tảng , cả về mặt nào khả dụng cũng như hành vi cụ thể của chúng và các tùy chọn cụ thể mà chúng hỗ trợ (tuy nhiên, hy vọng có một tập hợp con chung dựa trên các thông số kỹ thuật của POSIX)bashđược gọi là nội trang và chỉ chúng có thể được dựa vào để có mặt trên tất cả các nền tảng .Để kiểm tra xem một lệnh đã cho có phải là nội trang hay không , hãy sử dụng
type <cmdName>
Trong trường hợp hiện tại, chạy type envsubsttrên macOS 10.13 trả về -bash: type: envsubst: not found, từ đó bạn có thể suy ra:
envsubst KHÔNG phải là nội trangenvsubstkhông có trong hệ thống của bạn $PATH(và do đó có khả năng không xuất hiện trên hệ thống của bạn)(Ngược lại, chạy lệnh tương tự trên, ví dụ, hệ thống Ubuntu 12.04 trả về envsubst is hashed (/usr/bin/envsubst), điều này cho bạn biết rằng tiện ích đang có mặt và vị trí của nó.)
Một giải pháp thay thế tạm thời envsubstlà sử dụng eval, mặc dù áp dụng cảnh báo thông thường: evalchỉ sử dụng trên các chuỗi có nội dung bạn kiểm soát hoặc tin cậy:
Giả sử một sample.txttệp chứa văn bản với các tham chiếu biến không được mở rộng; ví dụ:
cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF
Tương đương với:
envsubst < sample.txt
Là:
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Tuy nhiên, có một sự khác biệt quan trọng :
envsubstchỉ mở rộng các tham chiếu biến môi trườngevalsẽ mở rộng vỏ tài liệu tham khảo biến quá - cũng như nhúng thay thế lệnh , đó là những gì làm cho sử dụng của evalmột mối quan tâm an ninh.eval echovì tôi tin tưởng vào nguồn nhưng nó không giống nhau .. envsubst < .env.examplekhông thể chỉ làeval echo < .env.example
Bây giờ tôi đang sử dụng điều này trong tập lệnh bash của mình yêu cầu 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
bạn có thể sử dụng nó dưới dạng lệnh envsubst - tất nhiên nó không hoàn chỉnh về tính năng hoặc một cái gì đó khác:
envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
"khoảng $ line nhưng tôi chưa thử cái này
envsubstđược bao gồm tronggettextgói. bạn có thể biên dịch của riêng bạn. xem stackoverflow.com/questions/14940383/…