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'

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.


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 : используйте глобальные переменные (которые вы упомянули, что вы не предпочитаете), или передайте имя переменной, чтобы вернуть результат.


/dev/stderrуказывает на fd 2 и все еще может быть перенаправлен с помощью &>blahили 2>blah. /dev/ttyможет быть лучше.
Arthur2e5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.