2011-10-18 16 views
8

Tôi có một mã như thế này:xuất khẩu không làm việc (từ một chức năng gọi là để có được tiếng vang của nó)

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    echo "some output" 
} 

final_output="the otput is $(test_this)" 
echo "$ABC" 

Thật không may là biến ABC không được thiết lập.

Tôi phải gọi test_this như vậy, vì trong chương trình thực sự của tôi, tôi thực hiện một số đối số, nó thực hiện các thao tác phức tạp khác nhau, gọi các chức năng khác nhau, trên đường xuất dữ liệu này (dựa trên các đối số đó), và ở cuối một số chuỗi đầu ra được lắp ráp để được trả về. Gọi nó hai lần, một lần để có được xuất khẩu và một lần cho chuỗi đầu ra sẽ là xấu.

Câu hỏi đặt ra là: tôi có thể làm gì để có cả xuất và chuỗi đầu ra tại chỗ, nhưng chỉ bằng một cuộc gọi đến một hàm như vậy?

Câu trả lời rằng tôi hài lòng với (cảm ơn bạn paxdiablo):

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    export A_VERY_OBSCURE_NAME="some output" 
} 

test_this 
final_output="the otput is $A_VERY_OBSCURE_NAME" 
echo "$ABC" #works! 
unset A_VERY_OBSCURE_NAME 

Trả lời

7

Vâng, nó đang được thiết lập. Rất tiếc, nó được đặt trong quy trình phụ được tạo bởi $() để chạy hàm test_this và không ảnh hưởng đến quy trình gốc.

Và gọi đó là hai lần có lẽ là cách dễ nhất để làm điều đó, một cái gì đó tương tự (sử dụng một "bí mật" tham số giá trị cho lệnh hành vi nếu nó cần phải được khác nhau):

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    if [[ "$1" != "super_sekrit_sauce" ]] ; then 
    echo "some output" 
    fi 
} 

final_output="the output is $(test_this)" 
echo "1:$ABC:$final_output" 
test_this super_sekrit_sauce 
echo "2:$ABC:$final_output" 

mà kết quả đầu ra:

1::the output is some output 
2:ABC:the output is some output 

Nếu bạn thực sự chỉ muốn gọi nó một lần, bạn có thể làm một cái gì đó như:

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    export OUTPUT="some output" 
} 

test_this 
final_output="the output is ${OUTPUT}" 
echo "1:$ABC:$final_output" 

Nói cách khác, sử dụng cùng một phương pháp để trích xuất đầu ra như bạn đã làm cho các thông tin khác.

+0

Cảm ơn thông tin chi tiết này, nhưng nó không giúp tôi. Có cách nào tôi có thể gọi hoặc thay đổi chức năng này, để tôi thực sự có thể xuất khẩu ra ngoài không ?. – robert

+1

@robert: xem cập nhật. Vấn đề thực sự của bạn là '$()' nhất thiết tạo ra một tiến trình con để bất kỳ thay đổi môi trường nào sẽ bị giới hạn trong tiến trình con đó. Thay vào đó, nếu bạn gọi hàm trực tiếp, bạn có thể ảnh hưởng đến môi trường quy trình hiện tại. – paxdiablo

+0

Cảm ơn bạn, tôi đã đi với tùy chọn thứ hai, thêm vào cuối: unset OUTPUT. – robert