Bash Scripting echo localmente em uma função

8

Nos scripts bash eu tento manter minhas variáveis locais em funções onde quer que eu possa e depois passar o que eu preciso de funções como abaixo

#!/bin/bash

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

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Mas é possível fazer isso enquanto incluo o próprio echo da função, de modo que, se a função tiver suas próprias mensagens para a saída, não é necessário capturá-las em uma variável

#!/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'
    
por Trent 15.10.2015 / 13:07

2 respostas

13

Qualquer coisa que seja impressa pela função pode ser capturada se você capturar o fluxo de saída correto. Portanto, a maneira mais fácil de imprimir algo e salvar alguma outra saída é redirecionar a saída supérflua para o erro padrão:

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

Outra possibilidade é registrar em um arquivo em vez de imprimir mensagens de log diretamente, por exemplo, usando algo assim:

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

Dito isto, as funções Bash não podem retornar variáveis . O único valor real de "retorno" é o código de saída. Por esse motivo ( e muitos outros ), se você quiser log confiável, valores de retorno, manipulação de exceção e mais você vai querer usar uma linguagem diferente, como Python, Ruby ou Java.

    
por 15.10.2015 / 13:42
3

Você pode apresentar mensagens informativas sobre um erro padrão:

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

Algumas outras sugestões estão em este artigo do Linux Journal : use variáveis globais (que você mencionou você não prefere), ou passe o nome da variável para retornar o resultado.

    
por 15.10.2015 / 13:42