Bash Scripting эхо локально в функции

13

В скриптах bash я стараюсь держать свои переменные локальными для функций везде, где могу, а затем пропускаю то, что мне нужно, из функций, таких как ниже.

#!/bin/bash

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

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Но возможно ли это сделать, включив собственный эхо функции, чтобы, если у функции есть собственные сообщения для вывода, мне не нужно было перехватывать их в переменной

#!/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
источник
1
Эй, почему вы, ребята, все используете старый, не POSIX function foo()синтаксис? Вы можете получить лучшую совместимость с POSIX с меньшим количеством нажатий клавиш.
Arthur2e5
2
Этот синтаксис мне просто более знаком
TheLovelySausage
1
@ Arthur2e5 в первую очередь потому, что при поиске по коду легче набирать «function», чем «[a-zA-Z0-9] + \ (\) \ {»
Алекс Янсен,

Ответы:

16

Все, что напечатано функцией, может быть захвачено, если вы захватите правильный поток вывода. Поэтому самый простой способ напечатать что-нибудь и сохранить какой-либо другой вывод - перенаправить лишний вывод на стандартную ошибку:

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

Другая возможность - войти в файл, а не печатать сообщения журнала напрямую, например, используя что-то вроде этого:

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

Тем не менее, функции Bash не могут возвращать переменные . Единственным фактическим значением «return» является код выхода. По этой причине ( и многим другим ), если вам нужна надежная регистрация, возвращаемые значения, обработка исключений и многое другое, вы захотите использовать другой язык, такой как Python, Ruby или Java.

l0b0
источник
5

Вы можете представить информационные сообщения о стандартной ошибке:

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

Некоторые другие предложения содержатся в этой статье Linux Journal : используйте глобальные переменные (которые вы упомянули, что вы не предпочитаете), или передайте имя переменной, чтобы вернуть результат.

CXW
источник
/dev/stderrуказывает на fd 2 и все еще может быть перенаправлен с помощью &>blahили 2>blah. /dev/ttyможет быть лучше.
Arthur2e5