Bash 스크립트는 함수에서 로컬로 에코됩니다.

Bash 스크립트는 함수에서 로컬로 에코됩니다.

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

올바른 출력 스트림을 캡처하면 함수가 인쇄하는 모든 내용을 캡처할 수 있습니다. 따라서 무언가를 인쇄하고 다른 출력을 저장하는 가장 쉬운 방법은 추가 출력을 표준 오류로 리디렉션하는 것입니다.

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

또 다른 가능성은 다음과 같이 로그 메시지를 직접 인쇄하는 대신 파일에 기록하는 것입니다.

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

즉, Bash 기능변수를 반환할 수 없습니다.. 유일한 실제 "반환" 값은 종료 코드입니다. 이런 이유로(그리고 많은 다른 사람들), 안정적인 로깅, 반환 값, 예외 처리 등을 원한다면 Python, Ruby 또는 Java와 같은 다른 언어를 사용해야 합니다.

답변2

표준 오류에 대한 정보 메시지를 표시할 수 있습니다.

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

다른 제안 사항은 다음과 같습니다.이 Linux 저널 기사: 마음에 들지 않는다고 언급한 전역 변수를 사용하거나 변수 이름을 전달하여 결과를 반환합니다.

관련 정보