zsh không giữ nguyên trích dẫn `$ *` và `$ @` bằng nhau


3

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 $*$@chỉ $ccầ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 $*$@

Thay đổi một lần nữa $cthà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) $*$@bằng nhau.

shell  zsh  quoting 

3
Có vẻ như câu hỏi của bạn sôi nổi tại sao zsh -o shwordsplit -c 'IFS=:; echo $@' sh x a:bđầu ra x a:bvà 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)
Stéphane Chazelas


Cảm ơn đã xác nhận rằng tiêu đề của câu hỏi là chính xác và mô tả chính xác nhận xét của bạn.

Vấn đề được báo cáo bởi @ StéphaneChazelas trên zsh-
worker

@Arkanosis Cảm ơn thông tin. Ý tưởng tốt để có được nó giải quyết.

Câu trả lời:


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.