2013-02-01 41 views
7

Tập lệnh này thể hiện định nghĩa hàm bash với dấu ngoặc đơn câu có dấu ngoặc. Dấu ngoặc đơn có hiệu ứng tốt đẹp khi tạo các biến môi trường được tạo trong hàm "cục bộ", tôi đoán là vì thân hàm được thực thi dưới dạng một trình bao con. Đầu ra là:Xác định nội dung hàm bash bằng dấu ngoặc đơn thay vì dấu ngoặc đơn

A=something 
A= 
B=something 
B=something 

Câu hỏi đặt ra là nếu điều này được cho phép để xác định hàm.

#!/bin/bash 

foo() (
    export A=something 
    echo A=$A 
) 

bar() { 
    export B=something 
    echo B=$B 
} 

foo 
echo A=$A 
bar 
echo B=$B 
+0

đoán sai. Các biến này xuất hiện là cục bộ, vì [lệnh ghép] này (http://wiki.bash-hackers.org/syntax/basicgrammar#compound_commands) được thực hiện trong một nhóm riêng biệt (ngữ cảnh), KHÔNG phải là một vỏ bọc con !! – Florian

+0

@Florian Bash và POSIX gọi đó là "môi trường bán vỏ", có thể đó là ý của anh ấy. Nhưng đúng: không phải là một quá trình mới. –

Trả lời

7

Có, cú pháp đó được cho phép. Như đã trình bày trong bash man page, định nghĩa của một hàm bash là:

[ function ] name() compound-command [redirection] 

Một số mô tả hơn (cũng từ trang người đàn ông):

Các cơ quan chức năng là lệnh ghép compound-command. Lệnh đó thường là danh sách các lệnh giữa {}, nhưng có thể là bất kỳ lệnh nào được liệt kê bên dưới Lệnh ghép hợp ở trên.

(){} danh sách đính kèm là các lệnh ghép. Danh sách đầy đủ (một lần nữa từ trang người đàn ông, chỉ cần thay đổi nội dung xuống một danh sách đơn giản):

Một lệnh phức hợp là một trong những điều sau đây:

(list) 
{ list; } 
((expression)) 
[[expression]] 
for name [ in word ] ; do list ; done 
for ((expr1 ; expr2 ; expr3)) ; do list ; done 
select name [ in word ] ; do list ; done 
case word in [ [(] pattern [ | pattern ] ...) list ;; ] ... esac 
if list; then list; [ elif list; then list; ] ... [ else list; ] fi 
while list; do list; done 
until list; do list; done 
+0

Cảm ơn vì điều đó. Tôi nhận thấy điều này không thành công: foo() (xuất A = cái gì đó; echo A = $ A) bar() {export B = something; echo B = $ B} Công trình này: foo() (xuất A = cái gì đó; echo A = $ A;) bar() {export B = something; echo B = $ B; } Tuy nhiên, thực hiện điều này: (echo Hi; echo Bye) – ELO

+1

Xin lỗi, tôi không chắc tôi hiểu - bạn có hỏi gì về dấu chấm phẩy không? –

+0

Tâm thổi, cảm ơn! –

1

Cả hai đều hợp lệ, và như Carl đề cập bất kỳ lệnh hợp chất cũng có thể được sử dụng, ví dụ:

$ f() if [ "$1" = 'a' ]; then echo 'equals a'; fi 
$ f a 
equals a 
$ f b 
$ 

POSIX 7 2.9.5 Chức năng Định nghĩa lệnhhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05:

Định dạng của một lệnh định nghĩa hàm như sau:

fname() hợp chất-lệnh [io-redirect ...]

[...] Hợp chất tranh luận -command đại diện cho một lệnh ghép, như được mô tả trong các Lệnh Hợp chất.

Sau đó 2.9.4 Compound lệnhhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04:

(hợp chất-list) [...] bài tập biến và lệnh built-in có ảnh hưởng đến môi trường sẽ không có hiệu lực sau khi danh sách kết thúc.

{compound-list;} Thực thi danh sách hợp chất trong môi trường quy trình hiện tại.

Ngữ nghĩa giống như sử dụng () không có định nghĩa hàm: nó không tạo ra một quy trình mới, nhưng được thực thi trong những gì POSIX và Bash gọi là "môi trường bán vỏ".

Các vấn đề liên quan