Làm thế nào để ksh93 tránh dĩa thay thế lệnh


12

Được

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'

vỏ có xu hướng cần làm 2 dĩa để thực hiện

strace-f(){ strace -f "$@" 2>&1; }; 
for sh in dash bash zsh ksh; do 
    printf "$sh\t" ; strace-f $sh -c "$cmd"  |grep -e clone -e fork -c;
done

ngoại trừ kshanh hùng làm cho nó mà không cần một lần:

dash    2
bash    2
zsh     2
ksh     0

sao làm được vậy?


Biên tập:

Đây là cách nó đi xuống với một đường ống ném vào:

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'

Đầu ra:

dash    11
bash    10
zsh     5
ksh     3 

Nó không quản lý điều này cho toàn bộ đường ống mặc dù. Tôi muốn làm điều này có thể cho toàn bộ đường ống, có thể mang nó đến các vỏ khác.
PSkocik

3
Chỉ để kiểm tra vệ sinh, bạn đã kshcài đặt chưa? Khi tôi chạy mã của bạn, tôi nhận được 0bất kỳ shell nào tôi chưa cài đặt
Eric Renouf

1
@EricRenouf Lol, vâng tôi làm. Và nó cũng làm công cụ. ;)
PSkocik

Người trả lời có thể muốn đọc stackoverflow.com/questions/14686872 .
JdeBP

Câu trả lời:


13

Ksh93 làm rất nhiều để tránh dĩa. Tôi không biết làm thế nào nó biết cách xử lý trường hợp đầu tiên, vì một trusschương trình cho thấy nó chỉ gọi một write(2)cuộc gọi với kết quả cuối cùng.

Có thể là David quét lệnh trong macro.c và biết rằng anh ta có thể xử lý "tiếng vang" bên trong.

Điều tôi có thể nói là tôi đã viết lại trình phân tích cú pháp và trình thông dịch của "Bourne Shell" năm ngoái và chủ yếu giảm số lượng dĩa và thay thế nhiều dĩa bằng vfork()các cuộc gọi. Điều này hiện làm cho Bourne Shell trở thành lớp vỏ nhanh thứ hai sau ksh93. Bạn có thể muốn chạy thử nghiệm của bạn boshlà tốt.

BTW: ksh93 tránh dĩa nói chung. Nó thực hiện một cấu trúc có chứa tất cả các biến toàn cục trước đó và điều này làm cho mã shell trở lại nếu nó được gọi với các phiên bản khác nhau của con trỏ cấu trúc biến "toàn cầu".

Phương pháp này được sử dụng bởi ksh93 bất cứ khi nào có một (cmd)subshell.

Lý do cho việc viết lại này là vì David đang sử dụng Win-DOS trên máy tính xách tay của anh ấy và anh ấy không thích Cygwin chậm chạp, vì vậy anh ấy đã viết UWIN và sử dụng trực tiếp ksh93 trên Win-DOS. Vì không có fork()trên Win-DOS, anh ta cần tìm một giải pháp mớ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.