Cách tốt nhất để phát hiện (từ một tập lệnh) cho dù phần mềm được cài đặt là gì?


9

Trước đây tôi đã thất vọng với sự khác biệt về đầu ra từ whichlệnh trên các nền tảng khác nhau (Linux so với Solaris vx. OS X), với các vỏ khác nhau cũng có thể ảnh hưởng đến vấn đề này. typeđã được đề xuất như là một thay thế tốt hơn, nhưng làm thế nào di động sẽ được?

Trước đây, tôi đã viết các hàm phân tích đầu ra whichvà xử lý các trường hợp sử dụng khác nhau mà tôi gặp phải. Chúng hoạt động trên các máy tôi sử dụng, và các tập lệnh cá nhân của tôi cũng không sao, nhưng điều này dường như không đáng tin cậy cho phần mềm mà tôi sẽ đăng ở đâu đó cho người khác sử dụng.

Để lấy một ví dụ có thể, giả sử tôi phải phát hiện từ tập lệnh xem bash và zsh có khả dụng trên máy không, và sau đó chạy lệnh với zsh nếu có, và với bash nếu zsh không và bash là đủ phiên bản để không có một lỗi cụ thể. Hầu hết các phần còn lại của tập lệnh có thể là Bourne shell hoặc Ruby hoặc bất cứ thứ gì khác, nhưng điều này đặc biệt phải được thực hiện (AFAIK) với zsh hoặc một phiên bản bash gần đây.

Tôi có thể tin tưởng vào typeviệc có sẵn trên các nền tảng không? Có một số thay thế khác whichmà có thể dễ dàng và nhất quán trả lời câu hỏi liệu một phần mềm cụ thể được cài đặt không?

(Nếu bạn cũng muốn đưa ra các ý tưởng liên quan cụ thể đến ví dụ tôi đã đưa ra, điều đó thật tuyệt, nhưng tôi chủ yếu chỉ hỏi về trường hợp chung: cách đáng tin cậy nhất để tìm hiểu xem một thứ cụ thể được cài đặt trên một máy cụ thể ?)

Câu trả lời:


10

Trong thế kỷ 21, đặc biệt nếu bạn đang nhắm mục tiêu các máy có khả năng có bash hoặc zsh, bạn có thể tin tưởng vào typeviệc có sẵn. (Nó không tồn tại trong các hiệp hội cực kỳ cũ, như trong, từ những năm 1970 hoặc đầu những năm 1980.) khác không.

whichkhông chuẩn và không đáng tin cậy trong thực tế . typelà sự thay thế được đề nghị. whereisbị các vấn đề tương tự như whichvà ít phổ biến hơn. whencelà cụ thể cho ksh và zsh.

Khi có thể, sẽ đáng tin cậy hơn để kiểm tra sự tồn tại của lệnh và kiểm tra xem hành vi của nó có hợp lý hay không. Ví dụ: kiểm tra sự hiện diện của một phiên bản bash phù hợp bằng cách chạy bash -c 'somecommand', ví dụ:

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

Ngày nay, bạn có thể tin tưởng vào hầu hết mọi thứ trong phiên bản 2 đặc tả Singe UNIX (ngoại trừ những thứ kỳ lạ như Fortran và SCCS, dù sao cũng là tùy chọn). Bạn cũng có thể tin tưởng vào hầu hết phiên bản 3 , nhưng điều này chưa được thực hiện hoàn toàn ở mọi nơi. Hỗ trợ phiên bản 4 là sơ sài. Nếu bạn định đọc những thông số kỹ thuật này, tôi khuyên bạn nên đọc phiên bản 3, dễ đọc hơn và ít mơ hồ hơn phiên bản 2.

Để biết ví dụ về cách phát hiện tính đặc hiệu của hệ thống, hãy xem autoconfconfigurecác tập lệnh của các phần mềm khác nhau.

Xem thêm Tài nguyên để lập trình shell di động để biết thêm mẹo.


Điều này có thể được hưởng lợi từ việc mở rộng để nhận xét về các kỹ thuật thường được đề xuất sử dụng hashcommand -v.
Caleb

@Caleb Với mục đích của câu hỏi này, tôi không thấy lợi ích command -vvượt trội type, tất cả những gì chúng ta cần là kết quả boolean. Những gì các kỹ thuật thường được đề nghị sử dụng hashmà bạn đang đề cập đến?
Gilles 'SO- ngừng trở nên xấu xa'
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.