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

2
この構文は私にとってはより身近なものです
TheLovelySausage

1
@ Arthur2e5の主な理由は、コードを検索するときに「[a-zA-Z0-9] + \(\)\ {」よりも「関数」と入力する方が簡単だからです
Alex Jansen

回答:


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
}

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


/dev/stderrfd 2をポイントしますが、&>blahまたはによってリダイレクトでき2>blahます。/dev/tty多分よくなる。
Arthur2e5
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.