Anda dapat menggunakan env
untuk melihat semua variabel lingkungan yang ditentukan saat ini dan kemudian gunakan daftar itu untuk hanya menggantinya. (Halaman manual tidak terlalu jelas tentang itu, tetapi lihat jawaban ini untuk penjelasan.)
echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"
(Keluaran dari env
mencantumkan nilai variabel juga, tetapi envsubst
juga ingin melihat $
terkemuka , jadi kita tidak bisa hanya menggunakan cut -d= -f1
sendiri, sayangnya. Anda dapat menggunakan satu sed
untuk melakukan cut
tugasnya juga, lihat revisi sebelumnya, tapi saya lebih suka kejelasan cut
dengan sedikit peningkatan performa.)
Jika Anda memberikan argumen seperti $USER$PATH
ke envsubst
, maka hanya memperluas variabel yang dirujuk dalam argumen itu.
Jadi salah satu caranya adalah dengan meneruskan semua variabel lingkungan yang saat ini ditentukan dalam format itu. Dengan zsh
:
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst \$${(kj:$:)parameters[(R)*export*]}
$parameters
adalah larik asosiatif khusus yang memetakan nama variabel ke tipenya$parameters[(R)*export*]
memperluas ke semua elemen array asosiatif yang nilainya berisiexport
.- dengan
k
tanda perluasan parameter, kunci bukannya nilai yang dikembalikan j:$:
menggabungkan elemen tersebut dengan$
di antaranya, dan kami menambahkan satu di awal.
Dengan shell lain, Anda selalu dapat kembali ke perl
untuk mendapatkan daftar itu:
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"
Berhati-hatilah saat mengungkapkan nama variabel lingkungan Anda dalam keluaran ps
.
Sebagai gantinya, Anda juga dapat melakukan semuanya di perl
:
perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'
Berhati-hatilah karena memiliki batasan yang sama sebagai envsubst
karena itu tidak akan memperluas hal-hal seperti ${VAR:-x}
dan akan memperluas $HOME
dalam hal-hal seperti \$HOME
atau $$HOME
yang tidak akan dilakukan oleh shell.