Bash Scripting menggema secara lokal dalam suatu fungsi

13

Dalam skrip bash saya mencoba untuk menjaga variabel saya lokal ke fungsi di mana pun saya bisa dan kemudian melewati apa yang saya butuhkan dari fungsi seperti di bawah ini

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Tetapi apakah mungkin untuk melakukan ini sambil memasukkan gema fungsi itu sendiri sehingga jika fungsi memiliki pesan sendiri untuk dihasilkan, saya tidak harus menangkapnya dalam sebuah variabel

#!/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'
TheLovelySosisage
sumber
1
Hei kenapa kalian semua menggunakan function foo()sintaks lama, non-POSIX ? Anda bisa mendapatkan kompatibilitas POSIX yang lebih baik dengan 9 sedikit penekanan tombol.
Arthur2e5
2
Sintaks ini hanya lebih akrab bagi saya
TheLovelySausage
1
@ Arthur2e5 terutama karena lebih mudah untuk mengetik "fungsi" daripada "[a-zA-Z0-9] + \ (\) \ {" saat mencari melalui kode
Alex Jansen

Jawaban:

16

Apa pun yang dicetak oleh fungsi dapat ditangkap jika Anda menangkap aliran output yang tepat. Jadi cara termudah untuk mencetak sesuatu dan menyimpan beberapa output lainnya adalah dengan mengarahkan output berlebihan ke kesalahan standar:

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

Kemungkinan lain adalah untuk masuk ke file daripada mencetak pesan log secara langsung, misalnya menggunakan sesuatu seperti ini:

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

Yang mengatakan, fungsi Bash tidak dapat mengembalikan variabel . Satu-satunya nilai "kembali" yang sebenarnya adalah kode keluar. Karena alasan ini ( dan banyak lainnya ), jika Anda ingin pencatatan yang dapat diandalkan, mengembalikan nilai, penanganan pengecualian, dan lainnya, Anda ingin menggunakan bahasa yang berbeda seperti Python, Ruby atau Java.

l0b0
sumber
5

Anda dapat menyajikan pesan info tentang kesalahan standar:

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

Beberapa saran lain ada di artikel Jurnal Linux ini : gunakan variabel global (yang Anda sebutkan tidak Anda sukai), atau berikan nama variabel untuk mengembalikan hasilnya.

cxw
sumber
/dev/stderrmenunjuk ke fd 2 dan masih dapat diarahkan oleh &>blahatau 2>blah. /dev/ttymungkin lebih baik.
Arthur2e5