함수에서 로컬로 Bash 스크립팅 에코


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()구문을 사용하고 있습니까? 9 개의 적은 키 펀치로 더 나은 POSIX 호환성을 얻을 수 있습니다.
Arthur2e5

2
이 문법은 나에게 더욱 친숙합니다
TheLovelySausage

1
Arthur2e5 @ 주로 그 이상 "기능"을 입력하기 쉽기 때문 "[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 함수 는 변수를 반환 할 수 없습니다 . 실제 "반품"값은 종료 코드입니다. 이러한 이유로 ( 그리고 다른 많은 것들 ), 안정적인 로깅, 반환 값, 예외 처리 등을 원한다면 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
}

다른 리눅스 제안은 이 글에 실려있다 : 당신이 선호하지 않는 전역 변수를 사용하거나 결과를 리턴하기 위해 변수의 이름을 전달하라.


/dev/stderrfd 2를 가리키고 &>blah또는 로 리디렉션 될 수 있습니다 2>blah. /dev/tty더 나을 수 있습니다.
Arthur2e5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.