2015-12-01 14 views
6

Làm cách nào để tạo cả biến số localdeclare -r (chỉ đọc) trong bash?Làm thế nào để tạo một biến chỉ đọc cục bộ trong bash?

Nếu tôi làm:

function x { 
    declare -r var=val 
} 

Sau đó, tôi chỉ đơn giản là có được một toàn cầu var đó là read-only

Nếu tôi làm:

function x { 
    local var=val 
} 

Nếu tôi làm:

function x { 
    local var=val 
    declare -r var 
} 

Sau đó, tôi nhận được toàn cầu một lần nữa (tôi có thể truy cập var từ các chức năng khác).

Làm cách nào để kết hợp cả địa phương và chỉ đọc trong bash?

+5

'declare' được ghi lại là khai báo một biến cục bộ, trừ khi bạn yêu cầu một cách rõ ràng một biến toàn cục bằng cách thiết lập cờ' -g'. Tôi vừa thử nghiệm trên hệ thống của riêng mình và nó hoạt động như được ghi lại. Bạn có thể làm rõ lý do tại sao bạn tin rằng đây không phải là trường hợp? – ruakh

Trả lời

15

Mặc dù help local không đề cập đến nó trong Bash 3.x, local có thể chấp nhận các tùy chọn tương tự như declare (tính ít nhất Bash 4.3.30, giám sát tài liệu này đã được sửa chữa).

Vì vậy, bạn chỉ có thể làm:

local -r var=val 

Điều đó nói rằng, declarebên trong một hàm theo mặc định cư xử giống như local, như bang ruakh trong một chú thích, vì vậy cố gắng 1 của bạn cũng nên đã thành công khi tạo một biến số chỉ đọc cục bộ.

Trong Bash 4.2 trở lên, bạn có thể ghi đè này với declare 's -g tùy chọn để tạo một biến toàn cầu thậm chí từ bên trong một hàm (Bash 3.x không không hỗ trợ này.)

0

Nếu bạn muốn exit code bạn có thể sử dụng phương pháp này

function f { 
    local t=$(ls asdf 2>&1) c=$?; local -r t=$t; 

    echo 'Exit code: '$c; 
    echo 'Value: '$t; 
} 

f 

Prints:

Exit code: 1 
Value: ls: asdf: No such file or directory 
+0

Điều này liên quan đến câu hỏi như thế nào? Một lưu ý phụ: bạn không cần ';' để chấm dứt câu lệnh cuối cùng trên một dòng (trừ khi nó được theo sau bởi dấu đóng '}'). '' Giá trị: $ t "' vừa mạnh mẽ vừa tiện lợi hơn 'Giá trị: '$ t'. – mklement0

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