Bash Scripting лунає локально у функції


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
Гей, чому ви, хлопці, всі використовуєте старий function foo()синтаксис , не POSIX ? Ви можете покращити сумісність POSIX за допомогою 9 менших клавіш.
Arthur2e5

2
Цей синтаксис мені просто більш знайомий
TheLovelySausage

1
@ Arthur2e5 насамперед тому, що при пошуку коду простіше набрати "функцію", ніж "[a-zA-Z0-9] + \ (\) \ {"
Alex Jansen

Відповіді:


17

Все, що надруковано за допомогою функції, може бути зафіксовано, якщо ви зафіксували правильний вихідний потік. Тож найпростіший спосіб надрукувати щось і зберегти інший вихід - це перенаправити зайвий вихід на стандартну помилку:

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

Інша можливість - це увійти у файл, а не надрукувати повідомлення журналу безпосередньо, наприклад, використовуючи щось подібне:

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

При цьому функції Bash не можуть повертати змінні . Єдине фактичне значення "повернення" - код виходу. З цієї причини ( і багато інших ), якщо ви хочете надійного ведення журналу, повернення значень, обробку винятків і багато іншого, ви хочете використовувати іншу мову, наприклад Python, Ruby або Java.


6

Ви можете подавати інформаційні повідомлення про стандартну помилку:

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/stderrвказує на fd 2 і все ще може бути переспрямовано через &>blahабо 2>blah. /dev/ttyможе бути і краще.
Arthur2e5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.