Cái nào di động nhất của sed, awk, perl và sh?


15

Ai đó có thể đặt các công cụ này theo thứ tự tính di động? Cái nào trong số này chắc chắn được tìm thấy trên các hệ thống * nix tối thiểu nhất? Có ai trong số họ chắc chắn 100% có mặt? Tôi đoán là thứ tự như sau:

  1. ôi
  2. quyến rũ
  3. sh
  4. perl

Trong khi tôi tưởng tượng có những hệ thống không mặc định là vỏ bourne, một số vỏ sẽ có mặt như mặc định, liệu nó có luôn ở đó /bin/shkhông? Có lẽ là không nếu nó không phải là loại vỏ bourne. Cả hai awksedcó các trang giải thích chúng về đặc tả POSIX nên có lẽ chúng sẽ luôn có mặt. Là vậy sao? Tôi có thể chắc chắn rằng cả hai sẽ được cài đặt trên bất kỳ * nix nào không? Bao gồm các hệ thống nhúng?


hệ thống nhúng thường hy sinh tính di động để ở mức tối thiểu. Nhiều người không tuân thủ POSIX.
jordanm

@jordanm điều đó có nghĩa là họ có thể hình dung không có bất kỳ thứ gì trong số này? Tôi giả sử một hệ thống cung cấp ít nhất một giao diện shell tối thiểu. Tôi biết rằng busybox cung cấp sh, awksedví dụ và NAS dựa trên busybox của tôi cũng có perl.
terdon

1
Bạn có thể có chúng, nhưng những gì chúng làm sẽ khác nhau giữa các hệ thống, vì vậy câu hỏi không có nhiều ý nghĩa như đã nêu.
Stéphane Chazelas

@StephaneChazelas ah, bạn có thể giúp tôi thu hẹp nó lại được không? Không thể sắp xếp những thứ này theo khả năng chúng được tìm thấy trên hệ thống X? Kinh nghiệm của tôi là Linux và một vài hệ thống NAS nhúng. Tôi biết bạn sẽ không bao giờ có được GNU / Linux nếu không có cả 4 thứ này nhưng bạn không thể cho tôi biết ý tưởng nào trong số chúng là an toàn nhất để giả sử có mặt?
terdon

Câu trả lời:


14

Cái nào di động nhất của sed, awk, perl và sh?

sed, shawklà di động được quy định bởi POSIX, perlkhông phải là không được hỗ trợ bởi một tiêu chuẩn.

Ai đó có thể đặt các công cụ này theo thứ tự tính di động?

Nếu bạn tuân theo mã tuân thủ, sẽ không có thứ tự tính di động cho ba lệnh POSIX.

Cái nào trong số này chắc chắn được tìm thấy trên các hệ thống * nix tối thiểu nhất?

Ba POSIX cùng với nhiều tiện ích khác là bắt buộc đối với HĐH là POSIX. Các hệ điều hành thiếu một số trong số chúng do giảm thiểu hoặc cung cấp các triển khai không hoàn chỉnh / không tuân thủ vẫn tồn tại.

Trên thực tế, hầu hết (nếu không phải tất cả) Unix miễn phí và mã nguồn mở như các hệ điều hành có thể sẽ không vượt qua quy trình tuân thủ nếu họ cố gắng và dù sao họ cũng không bao giờ thử.

Có ai trong số họ chắc chắn 100% có mặt?

Tôi sẽ ngạc nhiên khi thấy một * nix như OS thiếu shell dựa trên cú pháp Bourne, nhưng mọi thứ đều có thể, đặc biệt là với các hệ thống nhúng.

Tôi đoán là thứ tự như sau: Một số shell sẽ có mặt như mặc định, nó sẽ luôn ở mức / bin / sh?

/bin/shcó khả năng là vỏ họ cú pháp Bourne nhưng không được đảm bảo tuân thủ POSIX, thậm chí vi hệ thống tuân thủ POSIX. Ví dụ, nó có /usr/xpg4/bin/shtrên Solaris 10 trở lên trong khi /bin/shvỏ Bourne ban đầu không phải là POSIX.


12

Lấy một gợi ý từ Autotools: bám vào mẫu số chung thấp nhất của vỏ Bourne và POSIX - có thể được tăng cường bởi sed- nếu bạn phải viết một cái gì đó phải hoạt động ở mọi nơi . Có thể tồn tại các hệ thống trong đó một cái gì đó bị phá vỡ, nhưng bạn có thể giải quyết các vấn đề như vậy bằng cách viết lại.

Ví dụ: một số hệ thống cổ có vấn đề với lỗi mở rộng test, hay còn gọi là [:

 if [ $foo = bar ] ; then...

Vì vậy , thực hành Autoconf là viết lại nó trong dấu ngoặc kép với một tiền tố ký tự duy nhất, như vậy:

 if [ x"$foo" = "xbar" ] ; then...

Bạn cũng có thể sử dụng "x$foo"ở đây. Điều này bảo vệ chống lại khả năng $foocó thể là một lựa chọn hợp lệ test(1), và vì [là bí danh cho test, nó có thể giải thích sai biểu thức. Giải pháp là thiết lập một tình huống trong đó đối số không xác định [luôn bắt đầu bằng x, có nghĩa là nó không thể có ý nghĩa đặc biệt [.

(Autoconf cũng khuyên bạn nên sử dụng testthay vì [, nhưng lời khuyên đó xuất hiện như một phản ứng đối với các xung đột có thể xảy ra với M4 , cũng sử dụng [cú pháp của nó.)

awk là POSIX , vì vậy về mặt lý thuyết nó có sẵn ở mọi nơi. Nó thậm chí còn trong Busybox , vì vậy bạn sẽ có một awktriển khai ngay cả trong một số hệ thống nhúng nhúng rất hạn chế. Tuy nhiên, tôi muốn được ít ngạc nhiên khi đi qua một hệ thống mà không awkhơn sed. Tôi cho rằng nó đi xuống sự phức tạp: các công cụ đơn giản có nhiều khả năng sống sót hơn trong việc phân chia tích cực.

Perl không phải là một phần của bất kỳ tiêu chuẩn phổ biến rộng rãi nào, POSIX hay nói cách khác, vì vậy bạn chỉ đơn giản là không thể tin tưởng vào nó nếu bạn không biết gì về môi trường mục tiêu. Perl không được cài đặt theo mặc định trong:

  • Cygwin
  • FreeBSD và NetBSD
  • Cài đặt "tối thiểu" cho một số Linux, bao gồm cả Slackware
  • nhiều Linux nhúng dựa chủ yếu vào Busybox cho vùng người dùng của họ

Hướng dẫn Autoconf có một chương về lập trình shell di động sẽ hữu ích cho bạn. Các công cụ phần cuối bìa thích sed, awkvà nhiều người khác.


Cảm ơn, nhưng tôi đang tự hỏi về thứ tự tính di động của những thứ này. Nếu tôi đọc đúng bạn, bạn đang gợi ý rằng shsedlà thiết bị di động nhất. OK, những gì của những người khác? Và có shthực sự là di động? Điều gì nếu shell mặc định là một dẫn xuất shell C? Một hệ thống như vậy vẫn sẽ có một liên kết tượng trưng tại /bin/sh?
terdon

Cảm ơn bạn đã chỉnh sửa, đó là điều, cả hai sedawkđược cung cấp bởi busybox, tại sao bạn sẽ ngạc nhiên hơn khi thấy sedvắng mặt? Bạn có biết nếu các lựa chọn thay thế busybox cũng cung cấp sed và awk không?
terdon

Re: POSIX vs Bourne shell , viết lại lời khuyên để bám vào màn hình LCD của hai người. Re: kiểm tra trích dẫn , tôi đã đánh giá sai lý do của nó, nhưng tìm thấy chương trong hướng dẫn Autoconf nơi lý do được đề cập, và chỉnh sửa câu trả lời cho phù hợp. Re: sed vs awk và Busybox , tôi đã giải thích rằng: sự phức tạp và sự phân chia lớn hơn. sedlàm ít hơn, do đó nhị phân của nó sẽ nhỏ hơn, do đó có ít lý do để loại bỏ nó hơn awk, điều này khá phức tạp. (20 kiB so với 48 kiB trên hệ thống của tôi.) Re: Busybox thay thế , tôi không biết về bất kỳ lựa chọn thay thế mua sắm nào khác.
Warren Young

+1 Bởi vì tôi đồng ý với tiền đề chung của bạn ở đây (rằng mẫu số chung thấp nhất sẽ là một loại sh- lẻ mà terdon xếp hạng awksedtrên o_O này?) Mặc dù điều này chỉ trùng với mục đích của Autotool, vì một số môi trường, đặc biệt là nhỏ, có thể không được dự định để xây dựng, thời gian.
goldilocks

1
@WarrenYoung đó là điều mà tôi đã tự hỏi về. Tôi không biết liệu tất cả các hệ thống * nix có cài đặt bourne shell theo mặc định hay không. Nếu tất cả họ đều có một /bin/sh, thì mọi thứ sẽ khác nhưng tôi không biết rằng tất cả sẽ có một. Xin lỗi vì đã không chấp nhận điều này bằng cách này, tôi đã bị giằng xé giữa câu trả lời của bạn và jlliagre cả hai đều trả lời câu hỏi của tôi. Tôi chọn anh ấy vì nó giải quyết nó trực tiếp hơn và vì anh ấy có ít đại diện hơn :).
terdon
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.