Apa itu SHELL-FORMAT di envsubst?

19

Ketika saya menemukan envsubstsaya ingin menggunakannya untuk mengganti hanya variabel-variabel spesifik dan menduga bahwa parameter SHELL-FORMAT mungkin yang diinginkan tetapi saya tidak bisa membuatnya berfungsi.

Sayangnya, halaman mandan infotidak memberikan contoh penggunaan dan hanya mengatakan

Jika SHELL-FORMAT diberikan, hanya variabel lingkungan yang dirujuk dalam SHELL-FORMAT yang diganti

Yang tidak memberi tahu saya bagaimana referensi mereka.

Tak seorangpun
sumber

Jawaban:

20

Seperti yang ditunjukkan oleh teks, Anda hanya perlu referensi (misalnya dengan $VARNAMEatau ${VARNAME}) variabel seperti pada perintah shell yang biasa. Namun, Anda harus memastikan bahwa shell tidak membesar sebelumnya.

Berikut adalah beberapa contoh untuk menggambarkan hal ini (dengan asumsi export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

Seperti yang Anda lihat, $ FOO2 telah diganti dengan "" karena tidak didefinisikan. Sekarang kita dapat membatasi penggantian hanya $ FOO dengan:

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

menggunakan ""alih-alih ''akan menyebabkan substitusi sebelum diinginkan:

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

(Ini berarti panggilan efektif envsubst "BAR"yang tidak mendeteksi variabel sehingga tidak ada yang diganti.)

Seperti yang mandikatakan -page, semua variabel yang direferensikan SHELL-FORMATdiganti, jadi kita bahkan dapat melakukan ini:

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

Seperti yang Anda lihat, SHELL-FORMATini cukup fleksibel.

Akhirnya, parameter ini --variablesmemungkinkan Anda untuk mengevaluasi variabel mana yang dipilih untuk diganti oleh SHELL-FORMAT:

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

Dalam contoh penggantian prematur dari atas ini akan menunjukkan kesalahan:

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

Seperti yang dinyatakan dalam manhalaman, envsubsttidak memproses stdinput ketika --variableshadir.

Tak seorangpun
sumber
8

Berikut adalah beberapa contoh yang membantu saya memahami cara menggunakannya dengan benar. Itu mengejutkan bagi saya bahwa envsubstonly menggantikan variabel yang disebutkan dalam parameter.

$ 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

Saya juga tidak mengerti apa artinya SHELL-FORMAT, masih tidak tahu mengapa itu dinamai seperti itu. Tetapi setelah percobaan di atas saya pikir saya tahu apa fungsinya.

dedeibel
sumber
Ini sangat membantu saya setelah membaca contoh itu, dari informasi dan bantuan pria, hanya tahu SHELL-FORMAT ada, tetapi tidak tahu bagaimana menyatakannya!
zw963
0

Kata-kata itu agak membingungkan. Untuk menulis ulang teks bantuan dengan lebih cermat:

SHELL-FORMATadalah argumen baris perintah teks opsional yang berisi referensi ke variabel lingkungan. Untuk referensi variabel lingkungan dalam teks, awali nama variabel dengan a $. Sebagai contoh: Hello $FOO World $BARreferensi variabel lingkungan FOOdan BAR. Sisa string diabaikan. Jika SHELL-FORMATargumen baris perintah ada, maka ketika substitusi variabel terjadi pada teks yang diterima melalui stdin, itu akan terbatas pada variabel yang dirujuk dalam SHELL-FORMATargumen baris perintah.

Jadi untuk menjawab pertanyaan Anda secara eksplisit: Awali nama variabel dengan $.

wizulus
sumber