Bash Scripting echo localmente in una funzione


13

Negli script bash cerco di mantenere le mie variabili locali nelle funzioni ovunque io possa e quindi passare ciò di cui ho bisogno fuori dalle funzioni come muggito

#!/bin/bash

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

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Ma è possibile farlo includendo gli echi della funzione in modo che se la funzione ha i propri messaggi da emettere non devo prenderli in una variabile

#!/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'

1
Ehi, perché state tutti usando la vecchia function foo()sintassi non POSIX ? Puoi ottenere una migliore compatibilità POSIX con 9 keypunch in meno.
Arthur2e5,

2
Questa sintassi mi è solo più familiare
TheLovelySausage,

1
@ Arthur2e5 principalmente perché è più facile digitare "funzione" rispetto a "[a-zA-Z0-9] + \ (\) \ {" quando si cerca nel codice
Alex Jansen,

Risposte:


16

Tutto ciò che viene stampato dalla funzione può essere acquisito se si acquisisce il flusso di output corretto. Quindi il modo più semplice per stampare qualcosa e salvare qualche altro output è reindirizzare l'output superfluo all'errore standard:

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

Un'altra possibilità è quella di accedere a un file anziché stampare direttamente i messaggi di registro, ad esempio usando qualcosa del genere:

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

Detto questo, le funzioni di Bash non possono restituire variabili . L'unico valore "return" effettivo è il codice di uscita. Per questo motivo ( e molti altri ), se si desidera una registrazione affidabile, valori di ritorno, gestione delle eccezioni e altro, è necessario utilizzare un linguaggio diverso come Python, Ruby o Java.


5

È possibile presentare messaggi informativi sull'errore standard:

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

Alcuni altri suggerimenti sono in questo articolo del Linux Journal : usa le variabili globali (che hai menzionato non preferisci) o passa il nome della variabile per restituire il risultato.


/dev/stderrpunta a fd 2 e può ancora essere reindirizzato da &>blaho 2>blah. /dev/ttyforse meglio.
Arthur2e5,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.