SHELL-FORMAT trong envsubst là gì?


19

Khi tôi vấp ngã envsubsttôi muốn sử dụng nó để chỉ thay thế các biến cụ thể và nghi ngờ rằng tham số SHELL-FORMAT có thể là những gì mong muốn nhưng tôi không thể làm cho nó hoạt động.

Thật không may, các trang maninfokhông đưa ra bất kỳ ví dụ sử dụng nào và chỉ nói

Nếu một SHELL-FORMAT được đưa ra, chỉ những biến môi trường được tham chiếu trong SHELL-FORMAT được thay thế

Mà không cho tôi biết làm thế nào để tham khảo chúng.

Câu trả lời:


20

Như được chỉ ra bởi văn bản, bạn chỉ cần tham chiếu (ví dụ: $VARNAMEhoặc ${VARNAME}) các biến như trong lệnh shell thông thường. Tuy nhiên, bạn phải chắc chắn rằng vỏ không mở rộng chúng trước.

Dưới đây là một số ví dụ để minh họa điều này (giả sử export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

Như bạn có thể thấy, $ FOO2 đã được thay thế bằng "" vì nó không được xác định. Bây giờ chúng tôi có thể giới hạn thay thế đó chỉ $ FOO bằng cách:

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2

sử dụng ""thay vì ''sẽ dẫn đến thay thế trước khi nó muốn:

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2

(Số tiền này cho cuộc gọi hiệu quả envsubst "BAR"giúp phát hiện không có biến nào nên không có biến nào được thay thế.)

Như trang đã mannói, tất cả các biến được tham chiếu trong SHELL-FORMATđược thay thế, vì vậy chúng tôi thậm chí có thể làm điều này:

echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2

Như bạn có thể thấy, SHELL-FORMATkhá linh hoạt.

Cuối cùng, tham số --variablescho phép bạn đánh giá biến nào được chọn để thay thế bằng SHELL-FORMAT:

envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3

Trong ví dụ thay thế sớm từ phía trên, điều này sẽ cho thấy lỗi:

$ envsubst --variables "$FOO"
(empty string returned)

Như đã nêu trong man-page, envsubstkhông xử lý bất kỳ stdinput nào khi --variablescó mặt.


7

Dưới đây là một số ví dụ giúp tôi hiểu làm thế nào để sử dụng nó đúng cách. Điều đáng ngạc nhiên với tôi là envsubston thay thế các biến được đề cập trong tham số.

$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst            
x foox y fooy z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz

Tôi cũng không hiểu SHELL-FORMAT nghĩa là gì, vẫn không biết tại sao nó lại được đặt tên như vậy. Nhưng sau những thí nghiệm trên tôi nghĩ tôi biết nó làm gì.


Điều này giúp tôi rất nhiều sau khi đọc những ví dụ đó, từ trợ giúp và thông tin của người đàn ông, chỉ biết SHELL-FORMAT tồn tại, nhưng không biết cách khai báo nó!
zw963

0

Verbiage là một chút nhầm lẫn. Để sắp xếp lại văn bản trợ giúp tỉ mỉ hơn:

SHELL-FORMATlà một đối số dòng lệnh văn bản tùy chọn có chứa các tham chiếu đến các biến môi trường. Để tham chiếu một biến môi trường trong văn bản, hãy đặt tiền tố tên biến với a $. Ví dụ: Hello $FOO World $BARtham chiếu các biến môi trường FOOBAR. Phần còn lại của chuỗi được bỏ qua. Nếu có SHELL-FORMATđối số dòng lệnh, thì khi thay thế biến xảy ra trên văn bản nhận được thông qua stdin, nó sẽ bị giới hạn ở các biến được tham chiếu trong SHELL-FORMATđối số dòng lệnh.

Vì vậy, để trả lời câu hỏi của bạn một cách rõ ràng: Tiền tố tên biến với $.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.