Bash Scripting echo cục bộ trong một chức năng


13

Trong các tập lệnh bash, tôi cố gắng giữ các biến của mình cục bộ thành các hàm bất cứ nơi nào tôi có thể và sau đó chuyển những gì tôi cần ra khỏi các hàm như dưới đây

#!/bin/bash

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

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Nhưng có thể thực hiện việc này trong khi bao gồm tiếng vang riêng của hàm để nếu hàm có thông điệp riêng xuất ra thì tôi không phải bắt chúng trong một biến

#!/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
Xin chào, tại sao các bạn đều sử dụng function foo()cú pháp cũ, không phải POSIX ? Bạn có thể có được khả năng tương thích POSIX tốt hơn với 9 keypunches.
Arthur2e5

2
Cú pháp này chỉ quen thuộc hơn với tôi
TheLovelySausage

1
@ Arthur2e5 chủ yếu vì việc nhập "hàm" dễ dàng hơn so với "[a-zA-Z0-9] + \ (\) \ {" khi tìm kiếm thông qua mã
Alex Jansen

Câu trả lời:


16

Bất cứ thứ gì được in bởi chức năng đều có thể được ghi lại nếu bạn chụp đúng luồng đầu ra. Vì vậy, cách dễ nhất để in một cái gì đó và lưu một số đầu ra khác là chuyển hướng đầu ra thừa sang lỗi tiêu chuẩn:

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

Một khả năng khác là đăng nhập vào một tệp thay vì in các thông điệp tường trình trực tiếp, ví dụ như sử dụng một cái gì đó như thế này:

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

Điều đó nói rằng, hàm Bash không thể trả về các biến . Giá trị "trả lại" thực tế duy nhất là mã thoát. Vì lý do này ( và nhiều người khác ), nếu bạn muốn ghi nhật ký đáng tin cậy, trả về giá trị, xử lý ngoại lệ và nhiều hơn nữa bạn sẽ muốn sử dụng một ngôn ngữ khác như Python, Ruby hoặc Java.


5

Bạn có thể trình bày thông báo về lỗi tiêu chuẩn:

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

Một số đề xuất khác có trong bài viết trên Tạp chí Linux này : sử dụng các biến toàn cục (mà bạn đã đề cập mà bạn không thích) hoặc chuyển tên của biến để trả về kết quả.


/dev/stderrtrỏ đến fd 2 và vẫn có thể được chuyển hướng bởi &>blahhoặc 2>blah. /dev/ttycó thể tốt hơn.
Arthur2e5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.