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.)