Tất cả các shell được kiểm tra đều làm tương tự cho cặp (được trích dẫn) "$ *" và "$ @" với mã này:
c='set a b @ c; IFS=:,@ ; a=$(printf "<%s> " "$*"); b=$(printf "<%s> " "$@"); printf "%-20s and %-20s\n" "$a" "$b"'
d=(sh ash dash attsh ksh lksh mksh bash b44sh y2sh zsh zsh4 "zsh -y")
for shell in "${d[@]}"; do
printf '%15s: ' "$shell"
$shell -c "$c"
done
Các kết quả:
sh: <a:b:@:c> and <a> <b> <@> <c>
ash: <a:b:@:c> and <a> <b> <@> <c>
dash: <a:b:@:c> and <a> <b> <@> <c>
attsh: <a:b:@:c> and <a> <b> <@> <c>
ksh: <a:b:@:c> and <a> <b> <@> <c>
lksh: <a:b:@:c> and <a> <b> <@> <c>
mksh: <a:b:@:c> and <a> <b> <@> <c>
bash: <a:b:@:c> and <a> <b> <@> <c>
b44sh: <a:b:@:c> and <a> <b> <@> <c>
y2sh: <a:b:@:c> and <a> <b> <@> <c>
zsh: <a:b:@:c> and <a> <b> <@> <c>
zsh4: <a:b:@:c> and <a> <b> <@> <c>
zsh -y: <a:b:@:c> and <a> <b> <@> <c>
Tuy nhiên, đối với các bài kiểm tra không được trích dẫn $*
và $@
chỉ $c
cần thay đổi):
c='set a b @ c; IFS=:,@ ; a=$(printf "<%s> " $*); b=$(printf "<%s> " $@); printf "%-20s and %-20s\n" "$a" "$b"'
Kết quả là:
sh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
ash: <a> <b> <> <> <c> and <a> <b> <> <> <c>
dash: <a> <b> <> <> <c> and <a> <b> <> <> <c>
attsh: <a> <b> <> <c> and <a> <b> <> <c>
ksh: <a> <b> <> <c> and <a> <b> <> <c>
lksh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
mksh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
bash: <a> <b> <> <> <c> and <a> <b> <> <> <c>
b44sh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
y2sh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
zsh: <a> <b> <@> <c> and <a> <b> <@> <c>
zsh4: <a> <b> <@> <c> and <a> <b> <@> <c>
zsh -y: <a> <b> <> <> <c> and <a> <b> <@> <c>
Bỏ qua việc loại bỏ các giá trị lặp lại trong ksh, tất cả các shell hoạt động theo cùng một cách trừ zsh. Mà trình bày a @
. Điều này có thể hợp lý nếu ý tưởng rằng các biến được trích dẫn theo mặc định (hoặc không có chia tách được thực hiện theo mặc định).
Nhưng khi cố gắng lấy mặc định của tất cả các shell khác và yêu cầu zsh phân tách (bỏ yêu cầu) các biến được sử dụng, chúng tôi nhận được các giá trị khác nhau cho $*
và$@
Thay đổi một lần nữa $c
thành:
c='set a b @ c; IFS=:,@ ; a=$(printf "<%s> " $*); b=$(printf "<%s> " $@); [ "$a" = "$b" ] && echo "Yes" || echo "Nope"'
chúng tôi nhận được kết quả rõ ràng này:
sh: Yes
ash: Yes
dash: Yes
attsh: Yes
ksh: Yes
lksh: Yes
mksh: Yes
bash: Yes
b44sh: Yes
y2sh: Yes
zsh: Yes
zsh4: Yes
zsh -y: Nope
Chỉ zsh không có trích dẫn (chia) $*
và $@
bằng nhau.
zsh -o shwordsplit -c 'IFS=:; echo $@' sh x a:b
đầu rax a:b
và khôngx a b
. Và tôi nghĩ câu trả lời là: bạn đã tìm thấy một lỗi . Bạn có thể muốn báo cáo nó trong danh sách gửi thư zsh (có thể sau khi kiểm tra phiên bản phát triển mới nhất)