2014-05-08 23 views
9

Hãy xem xét kịch bản sau đây (cú pháp số học được sử dụng cho local_var2 là không thích hợp cho trường hợp này):Sự khác nhau giữa ksh và bash script

#!/bin/ksh 

function my_func1 
{ 
    typeset local_var1=one 
    typeset local_var2 
    ((local_var2 = 1)) 
    echo my_func1: local_var1 = $local_var1, local_var2 = $local_var2 
} 

my_func2() 
{ 
    typeset local_var1=two 
    typeset local_var2 
    ((local_var2 = 2)) 
    echo my_func2: local_var1 = $local_var1, local_var2 = $local_var2 
} 
local_var1=0 
local_var2=0 
echo before functions: local_var1 = $local_var1, local_var2 = $local_var2 

my_func1 
echo after my_func1: local_var1 = $local_var1, local_var2 = $local_var2 

my_func2 
echo after my_func2: local_var1 = $local_var1, local_var2 = $local_var2 

Khi chạy nó sẽ cho kết quả như sau:

before functions: local_var1 = 0, local_var2 = 0 
my_func1: local_var1 = one, local_var2 = 1 
after my_func1: local_var1 = 0, local_var2 = 0 
my_func2: local_var1 = two, local_var2 = 2 
after my_func2: local_var1 = two, local_var2 = 2 

(không phải là điều mong đợi!)

Nếu tôi chạy cùng một tập lệnh trong bash, đầu ra là:

before functions: local_var1 = 0, local_var2 = 0 
my_func1: local_var1 = one, local_var2 = 1 
after my_func1: local_var1 = 0, local_var2 = 0 
my_func2: local_var1 = two, local_var2 = 2 
after my_func2: local_var1 = 0, local_var2 = 0 

(đó là những gì được mong đợi!)

+1

kiểm tra và xác nhận đầu ra! Mặc dù, ngoài việc nói rằng ksh hút, tôi không có lời giải thích cho điều này ;-) – zmo

+0

với một 'set -vx' trong mã (và mỗi hàm phụ thuộc shell) bạn sẽ thấy rằng nội dung của varaible rõ ràng là khác nhau của dự kiến ​​tại lần đầu tiên sử dụng lệnh gọi thứ hai – NeronLeVelu

Trả lời

7

Đây là một trong những sự kì quái của ksh93.

typeset ting của các biến để xác định phạm vi của họ như là địa phương chỉ làm việc với các định nghĩa hàm phong cách:

function func_name 
{ 
} 

Không phải với phong cách định nghĩa hàm:

func_name() 
{ 
} 

Với func_name() phong cách, mọi thứ đều toàn cầu. Vì vậy, hành vi của ksh là như mong đợi !!!

Nhưng bash rõ ràng là an toàn hơn ksh về vấn đề này. Vì vậy, nó đặt phạm vi của các biến trong cả hai chức năng như địa phương khi typeset được sử dụng.

FAQ mục trong tài liệu hướng dẫn ksh nêu sự khác biệt giữa defintions chức năng:

Q18. What is the difference between function name and name()? 

A18. In ksh88 these were the same. However, the POSIX standard 
    choose foo() for functions and defined System V Release 2 
    semantics to them so that there are no local variables 
    and so that traps are not scoped. ksh93 keeps the ksh88 
    semantics for functions defined as function name, and 
    has changed the name() semantics to match the POSIX 
    semantics. Clearly, function name is more useful. 
+1

+1 để khai sáng – PradyJord

2

Dựa trên mô tả trong this answer, bạn có nhiều khả năng chạy T phiên bản AT & của ksh, mà typeset xây dựng -in chỉ làm cho các biến cục bộ chỉ trong các hàm được khai báo với từ khóa function.

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