Bash Scripting Echo lokal in einer Funktion

13

In Bash-Skripten versuche ich, meine Variablen für Funktionen lokal zu halten, wo immer ich kann, und dann das, was ich brauche, aus Funktionen wie unten zu übergeben

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Aber ist es möglich, dies zu tun, während die eigenen Echos der Funktion eingeschlossen werden, so dass ich sie nicht in einer Variablen abfangen muss, wenn die Funktion ihre eigenen Nachrichten zur Ausgabe hat

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now"   # do not return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"                         # should only echo 'value'
TheLovelySausage
quelle
1
Hey, warum benutzt ihr alle die alte Nicht-POSIX- function foo()Syntax? Sie können eine bessere POSIX-Kompatibilität mit 9 weniger Tastenanschlägen erzielen.
Arthur2e5
2
Diese Syntax ist mir nur vertrauter
TheLovelySausage
1
@ Arthur2e5 in erster Linie, weil es einfacher ist, "Funktion" als "[a-zA-Z0-9] + \ (\) \ {" einzugeben, wenn man den Code durchsucht
Alex Jansen

Antworten:

15

Alles, was von der Funktion gedruckt wird, kann erfasst werden, wenn Sie den richtigen Ausgabestream erfassen. Der einfachste Weg, etwas zu drucken und eine andere Ausgabe zu speichern, besteht darin, die überflüssige Ausgabe auf einen Standardfehler umzuleiten:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"
    echo "This function is done now" >&2
}

Eine andere Möglichkeit besteht darin, sich in einer Datei anzumelden, anstatt Protokollnachrichten direkt zu drucken, beispielsweise mit folgenden Schritten:

log() {
    printf '%s\n' "$@" > my.log
}

Bash-Funktionen können jedoch keine Variablen zurückgeben . Der einzige tatsächliche "Rückgabewert" ist der Exit-Code. Aus diesem Grund ( und vielen anderen Gründen ) möchten Sie eine andere Sprache wie Python, Ruby oder Java verwenden, wenn Sie eine zuverlässige Protokollierung, Rückgabewerte, Ausnahmebehandlung und mehr wünschen.

l0b0
quelle
4

Sie können Infomeldungen zu Standardfehlern anzeigen:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now" > /dev/stderr  # goes to the screen
}

Einige andere Vorschläge finden Sie in diesem Artikel im Linux-Journal : Verwenden Sie globale Variablen (die Sie nicht bevorzugen) oder übergeben Sie den Namen der Variablen, um das Ergebnis zurückzugeben.

cxw
quelle
/dev/stderrzeigt auf fd 2 und kann weiterhin von &>blahoder umgeleitet werden 2>blah. /dev/ttyvielleicht besser.
Arthur2e5