GNU/Linux >> Znalost Linux >  >> Linux

Výstupní kód přiřazení proměnné k substituci příkazu v Bash

Všimněte si, že tomu tak není v kombinaci s local , jako v local variable="$(command)" . Tento formulář bude úspěšně ukončen, i když command selhalo.

Vezměte si například tento skript Bash:

#!/bin/bash

function funWithLocalAndAssignmentTogether() {
    local output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

function funWithLocalAndAssignmentSeparate() {
    local output
    output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate

Zde je výstup tohoto:

[email protected]:~$ ./tmp.sh 
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1

Důvodem je local je ve skutečnosti vestavěný příkaz a příkaz jako local variable="$(command)" volání local po nahrazením výstupu command . Stav ukončení tedy získáte z local .


Po provedení příkazu jako $(command) umožňuje, aby se výstup příkazu nahradil.

Když řeknete:

a=$(false)             # false fails; the output of false is stored in the variable a

výstup vytvořený příkazem false je uložena v proměnné a . Kromě toho je výstupní kód stejný, jako byl vytvořen příkazem. help false by řekl:

false: false
    Return an unsuccessful result.

    Exit Status:
    Always fails.

Na druhou stranu říká:

$ false                # Exit code: 1
$ a=""                 # Exit code: 0
$ echo $?              # Prints 0

způsobí, že výstupní kód přiřazení bude a má být vráceno, což je 0 .

EDIT:

Citace z manuálu:

Pokud jedna z expanzí obsahovala náhradu příkazu, stav ukončení příkazu je stav ukončení poslední provedené náhrady příkazu.

Citace z BASHFAQ/002:

Jak mohu uložit návratovou hodnotu a/nebo výstup příkazu do proměnné?

...

output=$(command)

status=$?

Přiřazení output nemá žádný vliv na command stav ukončení, který je stále $? .


Linux
  1. Ukončovací kódy příkazového řádku Bash byly demystifikovány

  2. Rozdíl mezi operátory Bash [[ Vs [ Vs ( Vs ((?

  3. Citace v rámci $(příkazová substituce) v Bash?

  1. Proč je nastavení proměnné před příkazem v Bash legální?

  2. Jednoduchá závorka v přiřazení proměnné Bash?

  3. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  1. Bash skriptování (I)

  2. Přesměrování výstupu příkazu do proměnné v bash se nezdaří

  3. Bash:Smyčka, dokud se stav ukončení příkazu nerovná 0