web-dev-qa-db-ja.com

関数のローカルで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'
13

正しい出力ストリームをキャプチャすると、関数によって出力されたものをキャプチャできます。したがって、何かを印刷して他の出力を保存する最も簡単な方法は、余分な出力を標準エラーにリダイレクトすることです。

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

別の可能性は、たとえば次のようなものを使用して、ログメッセージを直接出力するのではなく、ファイルにログを記録することです。

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

つまり、Bash関数は変数を返すことができません。実際の「戻り」値は、終了コードのみです。このため( その他多数 )、信頼できるロギング、戻り値、例外処理などが必要な場合は、Pythonなどの別の言語を使用する必要がありますRuby =またはJava。

17
l0b0

標準エラーに情報メッセージを表示できます:

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

他のいくつかの提案が このLinux Journalの記事 にあります:グローバル変数を使用するか(優先しないと述べました)、または変数の名前を渡して結果を返します。

6
cxw