2011-07-16 24 views
9

Sau đây là một trường hợp thử nghiệm đơn giản cho những gì tôi muốn minh họa.Mở rộng biến khác nhau trong zsh từ đó trong bash

Trong bash,

# define the function f 
f() { ls $args; } 

# Runs the command `ls` 
f 

# Runs the fommand `ls -a` 
args="-a" 
f 

# Runs the command `ls -a -l` 
args="-a -l" 
f 

Nhưng trong zsh

# define the function f 
f() { ls $args } 

# Runs the command `ls` 
f 

# Runs the fommand `ls -a` 
args="-a" 
f 

# I expect it to run `ls -a -l`, instead it gives me an error 
args="-a -l" 
f 

Dòng cuối cùng trong zsh trên trên, mang lại cho tôi những lỗi sau

ls: invalid option -- ' ' 
Try `ls --help' for more information. 

Tôi nghĩ zsh đang thực hiện

ls "-a -l" 

là khi tôi gặp lỗi tương tự.

Vì vậy, làm cách nào để nhận được hành vi của bash tại đây?

Tôi không chắc chắn nếu tôi rõ ràng, hãy cho tôi biết nếu có điều gì đó bạn muốn biết.

+2

Điều này không trả lời câu hỏi của bạn, nhưng tôi nghĩ điều này tốt hơn: 'f() {ls" $ @ "; }; f -a -l' –

+0

@glenn, Vâng, chắc chắn là vậy. Như tôi đã nói, đây chỉ là một minh họa của một vấn đề lớn hơn tôi có, nơi tôi phải sử dụng biến args. –

+1

@ShrikantSharat Nếu bạn đang viết kịch bản cho bash và zsh (và ksh), đừng làm điều này với biến 'args'. Sử dụng một mảng thay thế. – Gilles

Trả lời

21

Sự khác biệt là (theo mặc định) zsh không thực hiện tách từ cho mở rộng tham số không được kiểm soát.

Bạn có thể kích hoạt “bình thường” tách từ bằng cách thiết lập các tùy chọn SH_WORD_SPLIT hoặc bằng = cờ trên một mở rộng cá nhân:

ls ${=args} 

hoặc

setopt SH_WORD_SPLIT 
ls $args 

Nếu mảng vỏ mục tiêu của bạn hỗ trợ (ksh, bash, zsh), sau đó bạn có thể sử dụng một mảng tốt hơn:

args=(-a -l) 
ls "${args[@]}" 

Từ zsh FAQ:

Từ zsh Manual:

  • 14.3 Parameter Expansion

    Lưu ý đặc biệt là thực tế rằng những lời của các thông số không thể viện chứng không tự động tách ra trên khoảng trắng trừ khi tùy chọn SH_WORD_SPLIT được thiết lập; xem tham chiếu đến tùy chọn này bên dưới để biết thêm chi tiết. Đây là sự khác biệt quan trọng so với các loại vỏ khác.

  • SH_WORD_SPLIT

    lĩnh vực Nguyên nhân tách được thực hiện trên mở rộng tham số không thể viện chứng.

+0

Vâng, đó chỉ là những gì tôi muốn. Tôi không biết những gì để google hoặc nơi để tìm kiếm, bạn có thể trỏ đến một số tài liệu giải thích điều này? Cảm ơn câu trả lời. –

+0

Ngoài ra, việc sử dụng '$ {= args}' có tương thích với bash không? Các thử nghiệm của tôi xác nhận nó là ... –

+3

Tất cả các phiên bản * bash * (3.2.48 và 4.2.10) của tôi đều từ chối '$ {=…}'. Tôi khá chắc chắn là nó cụ thể để * zsh *. Nếu bạn đang nhắm mục tiêu * bash * và * zsh *, thì bạn có thể thử một mảng (trong câu trả lời được cập nhật của tôi). –

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