(4 odpovědi)
Uzavřeno před 2 lety.
Jeden z mých spolupracovníků mi poskytl syntaxi Bash, kterou neznám. Můj Google foo mi selhal v tom, co dělá a proč/kdy bych to měl použít.
Příkaz, který mi poslal, měl tento tvar:
someVariable=something
command
Původně jsem si myslel, že to odpovídá následujícímu:
someVariable=something ; command
Nebo
someVariable=something
command
To se ale nezdá být případem. Příklady:
[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ
[Jan-03 11:27][~]$ # Try running a command of the same format
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:
[Jan-03 11:27][~]$ echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$
Co tato syntaxe dělá? Co se stane s proměnnou, která byla nastavena? Proč to funguje?
Přijatá odpověď:
To je ekvivalentní:
( export someVariable=something; command )
Tím se vytvoří someVariable
proměnná prostředí s přiřazenou hodnotou, ale pouze pro spouštěný příkaz.
Zde jsou relevantní části bash
manuál:
Jednoduché příkazy
Jednoduchý příkaz je posloupnost volitelných přiřazení proměnných následují slova a přesměrování oddělená mezerami a ukončena ovládacím operátorem. První slovo určuje příkaz, který se má provést, a je předáno jako argument nula. Zbývající slova jsou předána jako argumenty vyvolanému příkazu.
(…)
Jednoduché rozšíření příkazů
Pokud [z rozšíření příkazu] nevyplývá žádný název příkazu, přiřazení proměnných ovlivní aktuální prostředí shellu. V opačném případě se proměnné přidají do prostředí prováděného příkazu a neovlivní aktuální prostředí prostředí .
Poznámka:Mějte na paměti, že toto není specifické pro bash
, ale specifikováno POSIX.
Upravit – Souhrnná diskuse z komentářů v odpovědi
Důvod BAZ=JAKE echo $BAZ
, nevytiskne JAKE je to proto, že substituce proměnné se provádí dříve než cokoli jiného. Pokud vynecháte substituci proměnné, chová se to podle očekávání:
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]