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 gettext
gó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ư make
hoặc sử dụng homebrew
.
Tuy nhiên, nó dường như gặp ít vấn đề khi cài đặt gettext
trong MacOS. Xem url sau để biết chi tiết: Cách cài đặt gettext trên MacOS X
envsubst
là 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/envsubst
mà 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?
gettext
bao gồm rất nhiều thứ; Nó có vẻ như quá mức cần thiết chỉ để envsubst
cà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:
envsubst
là 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 envsubst
trê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 trangenvsubst
khô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 envsubst
là sử dụng eval
, mặc dù áp dụng cảnh báo thông thường: eval
chỉ 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.txt
tệ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 :
envsubst
chỉ mở rộng các tham chiếu biến môi trườngeval
sẽ 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 eval
một mối quan tâm an ninh.eval echo
vì tôi tin tưởng vào nguồn nhưng nó không giống nhau .. envsubst < .env.example
khô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 tronggettext
gói. bạn có thể biên dịch của riêng bạn. xem stackoverflow.com/questions/14940383/…