Os scripts Bash ecoam localmente em uma função

13

Nos scripts bash, tento manter minhas variáveis ​​locais para funções sempre que possível e depois passar o que preciso para 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 incluindo os ecos da própria função, para que, se a função tiver suas próprias mensagens para saída, não seja 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'
TheLovelySausage
fonte
1
Ei, por que vocês estão usando a function foo()sintaxe antiga, não POSIX ? Você pode obter uma melhor compatibilidade com POSIX com menos 9 toques de teclas.
Arthur2e5
2
Essa sintaxe é apenas mais familiar para mim #
TheLovelySausage
1
@ Arthur2e5 principalmente porque é mais fácil de digitar "função" do que "[a-zA-Z0-9] + \ (\) \ {" quando pesquisar através do código
Alex Jansen

Respostas:

16

Qualquer coisa 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 é fazer logon em um arquivo em vez de imprimir diretamente as mensagens de log, por exemplo, usando algo como isto:

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

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

l0b0
fonte
5

Você pode apresentar mensagens informativas sobre 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 neste artigo do Linux Journal : use variáveis ​​globais (das quais você mencionou que não prefere) ou passe o nome da variável para retornar o resultado.

cxw
fonte
/dev/stderraponta para fd 2 e ainda pode ser redirecionado por &>blahou 2>blah. /dev/ttytalvez melhor.
Arthur2e5