GNU/Linux >> Znalost Linux >  >> Linux

Syntaxe tohoto Shell/bash:Somevariable=somevalue Somecommand?

Tato otázka zde již obsahuje odpovědi :Je shell přenosný ke spuštění příkazu na stejném řádku po přiřazení proměnné?

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

Související:Debian – Proč sdílená složka CIFS zobrazuje stejné soubory vícekrát?

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
[]

Linux
  1. 15 užitečných vestavěných příkazů Bash Shell (s příklady)

  2. Pochopení proměnných v Bash Shell pod Linuxem

  3. Jaký je význam `! -d` v tomto příkazu Bash?

  1. Jak programovat s Bash:Syntaxe a nástroje

  2. Přizpůsobení Bash Shell:Tučné/barva Příkaz?

  3. Bash Shell Exit Status Tutorial s praktickými příklady

  1. 6 Operátorů řetězení příkazového řádku Bash Shell v Linuxu

  2. Bash skript:Použití příkazu script z bash skriptu pro protokolování relace

  3. příkaz pro export bash