2011-09-08 18 views
6

Tôi cố gắng để chạy một chương trình như thế này:Làm thế nào để buộc bash/zsh để đánh giá tham số như nhiều tranh cãi khi áp dụng cho một lệnh

$CMD $ARGS 

nơi $ ARGS là một tập hợp các đối số với không gian. Tuy nhiên, zsh dường như đang chuyển nội dung của $ ARGS thành một đối số duy nhất cho tệp thực thi. Dưới đây là ví dụ cụ thể:

$export ARGS="localhost -p22" 
$ssh $ARGS 
ssh: Could not resolve hostname localhost -p22: Name or service not known 

Có cờ bash hoặc zsh kiểm soát hành vi này không?

Lưu ý rằng khi tôi đặt loại lệnh này trong tập lệnh $!/Bin/sh, nó thực hiện như mong đợi.

Cảm ơn,

SetJmp

+0

Không có nghĩa là zsh không tuân thủ POSIX? – jpalecek

+0

@jpalecek Nó không phải là trừ khi yêu cầu một cách rõ ràng (bằng cách thiết lập một số tùy chọn, bằng cách gọi nó bằng cách sử dụng liên kết tượng trưng '**/sh' ->'/bin/zsh' hoặc bằng cách sử dụng 'mô phỏng sh' (mà lần lượt chỉ đặt một số tùy chọn)). – ZyX

Trả lời

4

Nó sẽ có tác dụng nếu bạn sử dụng eval $CMD $ARGS.

7

Nếu bạn muốn có biến chuỗi (cũng có mảng) được chia thành các từ trước khi chuyển đến lệnh, hãy sử dụng $=VAR. Ngoài ra còn có một tùy chọn (shwordsplit nếu tôi không nhầm) sẽ làm bất kỳ command $VAR hoạt động như command $=VAR, nhưng tôi khuyên bạn không nên đặt: Tôi thấy rất bất tiện khi nhập các thứ như command "$VAR" (zsh: command $VAR) và command "${ARRAY[@]}" (zsh: command $ARRAY).

5

Trong zsh thật dễ dàng:

Sử dụng cmd ${=ARGS} chia $ARGS vào lập luận riêng bằng lời (chia vào khoảng trắng).

Sử dụng cmd ${(f)ARGS} để tách $ARGS thành các đối số riêng biệt theo dòng (chia nhỏ trên dòng mới nhưng không phải khoảng trắng/tab).

Như những người khác đã đề cập, việc đặt SH_WORD_SPLIT làm cho tách từ xảy ra theo mặc định, nhưng trước khi bạn làm điều đó trong zsh, cf. http://zsh.sourceforge.net/FAQ/zshfaq03.html để giải thích tại sao tính năng chia tách khoảng trắng không được bật theo mặc định.