Bash Scripting echo localmente en una función

13

En los scripts de bash, trato de mantener mis variables locales a las funciones siempre que puedo y luego paso lo que necesito de funciones como abajo

#!/bin/bash

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

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Pero, ¿es posible hacer esto mientras se incluyen los propios ecos de la función para que, si la función tiene sus propios mensajes de salida, no tenga que atraparlos en una variable

#!/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
fuente
1
Hola, ¿por qué están usando la function foo()sintaxis antigua que no es POSIX ? Puede obtener una mejor compatibilidad POSIX con 9 combinaciones de teclas menos.
Arthur2e5
2
Esta sintaxis me resulta más familiar
TheLovelySausage
1
@ Arthur2e5 principalmente porque es más fácil escribir "función" que "[a-zA-Z0-9] + \ (\) \ {" al buscar a través del código
Alex Jansen

Respuestas:

16

Todo lo que imprime la función se puede capturar si captura la secuencia de salida correcta. Entonces, la forma más fácil de imprimir algo y guardar alguna otra salida es redirigir la salida superflua al error estándar:

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

Otra posibilidad es iniciar sesión en un archivo en lugar de imprimir mensajes de registro directamente, por ejemplo, usando algo como esto:

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

Dicho esto, las funciones de Bash no pueden devolver variables . El único valor real de "retorno" es el código de salida. Por esta razón ( y muchas otras ), si desea un registro confiable, valores de retorno, manejo de excepciones y más, querrá usar un lenguaje diferente como Python, Ruby o Java.

l0b0
fuente
5

Puede presentar mensajes de información en error estándar:

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

Algunas otras sugerencias se encuentran en este artículo de Linux Journal : use variables globales (que mencionó que no prefiere) o pase el nombre de la variable para devolver el resultado.

cxw
fuente
/dev/stderrapunta a fd 2 y aún puede ser redirigido por &>blaho 2>blah. /dev/ttyquizás mejor.
Arthur2e5