Câu hỏi Rủi ro khi chuyển sang ZSH là gì?


Hầu hết lời khuyên cho Mac được viết giả sử bạn sử dụng shell Bash. Nếu tôi chuyển sang zsh, làm cách nào để không tương thích với các tập lệnh Bash hiện tại mà tôi có trên hệ thống của mình và lời khuyên mọi người trên SU cho tôi?

Liệu cái #!/bin/sh dòng ở đầu của kịch bản của tôi giúp đỡ?

Chỉnh sửa: Không liên quan đến câu hỏi là tại sao tôi muốn làm điều này. Hoàn thành tab tốt hơn. Tôi vừa thử viết zsh trong một kịch bản đăng nhập như được đề xuất ở đây và tôi hoàn toàn bị thổi bay.


4
2018-05-16 23:42


gốc




Các câu trả lời:


Dòng shebang bạn hiển thị có nghĩa là chạy kịch bản bằng cách sử dụng trình bao Bourne (hoặc một trình bao khác trong chế độ tương thích). Những tập lệnh đó có thể sẽ tiếp tục chạy bằng cách sử dụng cùng một trình bao mà chúng bây giờ nếu bạn chuyển sang zsh làm trình bao tương tác của bạn. Cách duy nhất sẽ thay đổi là nếu bạn liên kết sh đến zsh, nhưng điều đó không nên thay đổi chức năng.

Bạn sẽ tìm thấy một số lượng nhất định khả năng tương thích giữa zsh và Bash khi được sử dụng làm shell đăng nhập của bạn hoặc khi viết các script đặc biệt gọi cho một hoặc khác bằng cách sử dụng các dòng shebang như:

#!/usr/bin/bash

hoặc là

#!/usr/bin/zsh

Tuy nhiên, có rất nhiều thứ mà zsh thực hiện khác hoặc Bash không thể làm gì cả. Bash được sử dụng rộng rãi hơn nhiều, vì vậy có ít người quen thuộc với sự phức tạp của zsh. Tuy nhiên, thông tin về nó có sẵn rộng rãi. Ngoài ra, bạn sẽ thấy rằng có nhiều trợ giúp đầy đủ có sẵn ở đây.

Bạn sẽ thấy rằng để viết kịch bản, shell mạnh hơn đáng kể so với vỏ Bourne (sh), nhưng tại các chi phí của tính di động. Ngoài ra, kể từ Bash được sử dụng rộng rãi hơn zsh, các kịch bản của nó tương đối dễ dàng hơn.


4
2018-05-16 23:58



Cảm ơn vì điều đó. Bạn nói "shell mạnh hơn đáng kể so với vỏ Bourne." Ý bạn là bashhoặc là zsh như bạn thấy trong dòng shebang? - Dan Rosenstark
@ Yar: Vâng, cả Bash và zsh (và thậm chí cả Korn shell, đặc biệt là ksh93) đều có nhiều khả năng hơn sh. - Dennis Williamson
Được rồi, vì vậy hầu như tất cả các kịch bản lệnh shell đều được viết cho chế độ tương thích. Tôi không ý kiến. Trong khi đó dòng shebang của tôi nói #!/usr/bin/env ruby hầu hết thời gian, nhưng tôi sử dụng rất nhiều người khác sh tập lệnh. - Dan Rosenstark


Tôi không phải là người dùng zsh, nhưng từ những gì tôi đã đọc trên SuperUser và những nơi khác, tôi luôn nhận được ấn tượng rằng người hâm mộ của họ tập trung vào các tính năng bổ sung để sử dụng tương tác nhiều hơn cho kịch bản. Câu đầu tiên của mô tả về zsh trên Trang web ZSH, nhấn mạnh sự nhấn mạnh này vào các tính năng tương tác: "Zsh là một trình bao được thiết kế để sử dụng tương tác, mặc dù nó cũng là một ngôn ngữ kịch bản mạnh mẽ."

Điều đó nói rằng, nếu bạn đang lập kế hoạch chuyển đổi vỏ đăng nhập của bạn, bạn có thể tiếp tục viết kịch bản của bạn trong bash. Như một câu trả lời chỉ ra, kịch bản bash sẽ được di động hơn.

Các tập lệnh hiện tại có nội dung khiêu dâm #!/bin/sh (hoặc là #!/bin/bash hoặc bất kỳ đường dẫn nào khác) sẽ tiếp tục hoạt động tốt bất kể shell đăng nhập của bạn.


4
2018-05-17 03:04



Khi tôi viết kịch bản của riêng tôi, tôi sử dụng Ruby :) câu trả lời tốt, cảm ơn! - Dan Rosenstark
sử dụng zsh cực kỳ tiện lợi. Scripting nó, không phải ở tất cả. btw, zsh hoạt động khác nhau tùy thuộc vào cách bạn gọi nó, tức là nếu / bin / sh là một liên kết tượng trưng đến / bin / zsh, thì zsh sẽ hoạt động giống như / bin / sh - chiggsy


Đây bạn sẽ tìm thấy danh sách "bashisms", tức là các đoạn mã sẽ chạy trong bash shell nhưng không chạy trong các shell khác tương thích với bourne.

Nếu bạn muốn đạt được tính di động tối đa khi viết kịch bản lệnh shell hơn là bắt đầu tập lệnh của bạn #!/bin/sh và tránh "bashisms", để nó sẽ chạy trong bất kỳ shell tương thích posix nào khác, như ksh hoặc zsh.


3
2018-05-17 04:48



Cảm ơn, thông tin tốt khi được thêm vào các câu trả lời khác. - Dan Rosenstark


/bin/sh điểm để bash, chạy nó trong chế độ tương thích. Điều duy nhất thay đổi các thay đổi trong trình đăng nhập của bạn là những thay đổi sẵn có và cách chúng hoạt động. Kịch bản theo dòng shebang của họ.


1
2018-05-16 23:54



Cần lưu ý rằng điều này đúng trên một số hệ thống. Trên những người khác, nó được liên kết với dashhoặc là ash hoặc những người khác hoặc thậm chí nó thực sự là bản thân Bourne thực sự gây ra. - Dennis Williamson
Yup. Nhưng câu hỏi được gắn thẻ "osx". - Ignacio Vazquez-Abrams
Thật không may, "ghi chú" quá nhỏ để có thể nhận xét về SU. - Dan Rosenstark


Bằng cách "chuyển sang zsh", tôi giả định rằng bạn có nghĩa là một trong hai điều sau:

  • bạn sẽ sử dụng chsh (hoặc tương đương) để thay đổi shell đăng nhập của bạn thành zsh, hoặc là
  • bạn sẽ cấu hình Thiết bị đầu cuối (hoặc tương đương) để sử dụng zsh làm vỏ mặc định của nó.

Hầu hết các chương trình shell (shell "scripts") sẽ bao gồm một "Shebang" / "băm-bang" hàng. Các shebang tuyên bố mà thông dịch viên (shell) nên giải thích (chạy) chương trình theo sau nó.

Như một số câu trả lời khác cho thấy, các chương trình shell sử dụng dòng shebang sẽ không bị ảnh hưởng bởi việc lựa chọn shell đăng nhập của người dùng, cũng không phải bởi shell tương tác là cha mẹ hoặc Nth-parent của chương trình shell đã được khởi chạy.

Nếu bạn đang cài đặt phiên bản mới của zsh và bao gồm nó trong PATH của bạn, các chương trình sử dụng một shebang như #!/usr/bin/env zsh sẽ sử dụng phiên bản mới đó (khi được bắt đầu với một PATH đặt mới zsh Đầu tiên). Điều này chỉ có thể gây ra sự cố nếu một số thay đổi không tương thích được thực hiện giữa phiên bản cũ / nguyên gốc của bạn zsh và cái mới. Lưu ý rằng đây sẽ là một nộizsh (inter-zsh-version) vấn đề, không phải là vấn đề liên quan đến vỏ mà tôi nghi ngờ bạn đang quan tâm. Đây thường là danh mục lỗi nhỏ hơn nhiều so với (ví dụ: bạn đã thử chạy một bash chương trình với ksh.

Không sử dụng một dòng shebang vốn đã không di chuyển giữa các môi trường người dùng. Kết quả của việc cố chạy một tệp thực thi, không phải nhị phân tập tin mà thiếu một shebang phụ thuộc vào môi trường (hệ điều hành, vỏ, có thể đăng nhập shell, và các biến môi trường). Khi một tệp như vậy được chạy trên hệ thống Mac OS X 10.4 của tôi, hành vi này thay đổi theo trình bao chạy nó. kshbash cả hai giải thích các tập tin trong một bản sao chia hai của mình. zsh luôn chuyển nó đi /bin/sh. Nếu một số chương trình đã cố gắng exec nó trực tiếp, nó sẽ thất bại với ENOEXEC (điều này xảy ra bên trong vỏ, họ chỉ "che đậy nó" bằng cách "chạy" nó theo cách khác). Tôi có một trí nhớ mơ hồ về một số hệ thống cổ xưa thậm chí còn cố gắng sử dụng vỏ đăng nhập của người dùng trong tình huống này, nhưng việc tìm kiếm nhanh của tôi không bật lên bất cứ điều gì hữu ích.

 Tệp không phải nhị phân là tệp mà hạt nhân không nhận ra là một trong các định dạng đối tượng nhị phân được hỗ trợ của nó.


Theo như khả năng tương thích tương tác, zsh hỗ trợ nhiều cú pháp mở rộng từ bash và ksh (một số nếu phải được kích hoạt với các tùy chọn vỏ, mặc dù), rất nhiều lời khuyên "vỏ" bạn tìm thấy trên Super User sẽ hoạt động tốt trong zsh (ngay cả khi một số trong đó bao gồm "bashisms"). Một số điều (ràng buộc chỉnh sửa dòng lệnh, hoàn thành, hiển thị nhanh, v.v.) hoàn toàn khác với bash và ksh và sẽ yêu cầu cú pháp khác nhau cho các hoạt động tương tự.

  zsh có một chút bash khả năng tương thích hoàn thành, nhưng tôi chưa bao giờ thử nó.


1
2018-05-17 09:00



Vẫn đang xử lý việc này. +1 cho bây giờ :) - Dan Rosenstark
Nó hoạt động tốt hơn (bash complet của zsh) hơn bash. - chiggsy