Vím, že toto téma je staré, ale mám jednodušší pracovní řešení bez exportu proměnných. Může být jednolinkový, ale já dávám přednost rozdělení pomocí \ on line end.
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
Proměnné je třeba definovat na stejném řádku jako envsubst je být považován za proměnné prostředí.
'$var1,$var3' je volitelná pouze pro nahrazení specifikovaných. Představte si vstupní soubor obsahující ${VARIABLE_USED_BY_JENKINS} který by neměl být nahrazen.
S odkazem na odpověď 2 jste se při diskuzi o envsubst zeptali:
Jak mohu zajistit, aby to fungovalo s proměnnými, které jsou deklarovány v mém skriptu .sh?
Odpověď je, že před voláním envsubst jednoduše musíte exportovat své proměnné .
Řetězce proměnných, které chcete nahradit ve vstupu, můžete také omezit pomocí envsubst SHELL_FORMAT argument (aby se zabránilo nechtěnému nahrazení řetězce ve vstupu společnou hodnotou proměnné shellu – např. $HOME ).
Například:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
Nahradí všechny výskyty $VAR1 a $VAR2 (a pouze VAR1 a VAR2 ) v source.txt s 'somevalue' a 'someothervalue' respektive.
Když se podívám, ukázalo se, že v mém systému je envsubst příkaz, který je součástí balíčku gettext-base.
Takže to je snadné:
envsubst < "source.txt" > "destination.txt"
Pokud chcete použít stejný soubor pro oba, budete muset použít něco jako sponge od moreutilu , jak navrhl Johnny Utahh:envsubst < "source.txt" | sponge "source.txt" . (Protože přesměrování shellu jinak vyprázdní soubor před jeho čtením.)