Ngôn ngữ kịch bản phổ biến nhất cho Linux là?


24

Chúng tôi đang viết các kịch bản cho các hệ thống Linux, đã có một số tranh luận về việc ngôn ngữ kịch bản trình bày Linux phổ biến nhất sẽ sử dụng là gì. Bash, SH, Posix? Gì?


3
Tôi đoán sh.
Máy xay sinh tố

Bạn có một danh sách các distro mục tiêu? Hoặc các distro bắt buộc / mong muốn nó phải chạy trên?

4
"Sh"? "Sh" là gì? Vỏ Thomson? Vỏ Bourne? bash, ksh, pdksh, ash, zsh như được tìm thấy như /bin/shtrên hệ thống X hoặc Y ? Thông số kỹ thuật sh POSIX, Thông số kỹ thuật sh SUSv3, SUSv4, thông số kỹ thuật sh LSB? "Sh" tự nó không có nghĩa gì cả.
Stéphane Chazelas

1
nếu đây là phần mềm xây dựng và cài đặt tập lệnh, bạn có thể muốn kiểm tra Autotools, phần mềm cố gắng giải quyết các vấn đề biên dịch hệ thống chéo.
Lie Ryan

1
@sch Giao lộ chung di động nhất, "rõ ràng". Trong trường hợp những người không quen thuộc với hệ vỏ Unix bị đánh giá sai bởi nhận xét của bạn, thông số POSIX được thực hiện bởi gần như tất cả các trình bao hiện đại dám đặt tên shvà không tuân thủ shmà ngày nay không còn phù hợp (ví dụ như Bourne). Người ta có thể liệt kê ra một danh sách các phần mở rộng và biến thể ngày càng tăng nhưng nếu mục tiêu là "phổ quát" hoặc tính di động, thì ta nên đi theo hướng ngược lại. Câu trả lời của Gilles bao gồm các chi tiết sâu hơn.
jw013

Câu trả lời:


38

Có hai môi trường lập trình có sẵn trên mọi hệ điều hành giống như unix, đó là Turing-Complete và có thể gọi các chương trình khác: awksh , họ shell Bourne / POSIX. AWK được định hướng theo hướng xử lý văn bản (nó bổ sung cho các tiện ích chuyên dụng hơn), trong khi sh được định hướng là ngôn ngữ kết dính để đặt các chương trình lại với nhau. Sh là sự phổ biến ngôn ngữ kịch bản trên Linux và trên khắp thế giới unix.

Các POSIX tiêu chuẩn xác định các tính năng bắt buộc của chính nó sh và tiện ích đi kèm. Hầu hết các hệ thống giống như unix tuân thủ POSIX 1003.1-2004 (còn gọi là Unix v3 đơn, hay còn gọi là vấn đề Đặc tả cơ sở nhóm mở 6); phiên bản mới nhất của tiêu chuẩn đó là POSIX 1003.1-2008 (hay còn gọi là Unix v4 đơn, hay còn gọi là Vấn đề đặc tả cơ sở nhóm mở 7).

Mọi hệ thống giống Linux và unix hoặc Unix đều có lớp vỏ kiểu Bourne /bin/sh, và bất kỳ hệ thống không cổ nào cũng có lớp vỏ tuân thủ POSIX (không có lỗi thỉnh thoảng). Mọi hệ thống giống như unix hiện đại (bao gồm cả Linux) đều hỗ trợ shebang , vì vậy nó sẽ tự động chạy các tập lệnh /bin/shnếu dòng đầu tiên là #!/bin/sh. Có các hệ thống POSIX shđược đặt ở một nơi khác (thường là các lớp mô phỏng trên các HĐH mà bạn không nghĩ là giống như Unix).

Các hệ thống Linux nhúng có thể có hệ thống BusyBox bị loại bỏ không triển khai tất cả các tính năng POSIX. BusyBox có một số lượng lớn các tùy chọn thời gian biên dịch để phù hợp với các hệ thống dấu chân nhỏ, vì vậy thật khó để biết trước những gì sẽ xảy ra, bạn phải điều chỉnh các tập lệnh của mình cho một thiết bị cụ thể. BusyBox là triển khai dấu chân nhỏ phổ biến nhất của các tiện ích sh và các loại; một điều nữa bạn có thể gặp là môi trường shell cực kỳ giảm trong Android (các phiên bản sau ít bị thiếu máu hơn).

Các hệ thống Linux không nhúng hầu như luôn có dấu gạch ngang hoặc bash như /bin/sh. Dash là một vỏ nhỏ và nhanh, thực hiện ít hơn các tính năng POSIX. Bash là một vỏ lớn hơn với nhiều tính năng hơn.

Các hệ thống Linux không nhúng hầu như luôn có Bash được cài đặt như /bin/bash. Do đó, đối với tính di động trên các hệ thống Linux không được nhúng, bạn có thể giả sử rằng bash có sẵn. Trong số các tính năng bổ sung hữu ích của bash là mảng, khả năng đối phó với các tệp chấm một cách thuận tiện, pipestatusbiến để có được trạng thái trả về của tất cả các lệnh trong một đường ống, các toán tử so sánh bổ sung cho thời gian tệp và (trong các phiên bản gần đây) khớp biểu thức chính quy .

Một trong những đặc điểm của lập trình shell là bạn không chỉ sử dụng shchương trình, bạn cũng đang sử dụng một số tiện ích . Hầu hết các tiện ích xử lý tệp và xử lý văn bản trên Linux là các lõi GNU (trên các hệ thống nhúng, chúng thường từ BusyBox).

Nếu bạn cần tính di động ngoài Linux, cách tốt nhất của bạn là bám vào POSIX. Các biến thể unix khác có thể chưa được cài đặt bash (bash là một phần của cài đặt tiêu chuẩn trên OSX, nhưng là gói tùy chọn trên * BSD và hầu hết các thông báo thương mại). Hầu như tất cả các biến thể unix khác với Linux và OSX (tức là * BSD và các đơn vị thương mại) đều có một số phiên bản của vỏ Korn , ít nhất là pdksh . Nhiều tiện ích mở rộng tiện lợi của bash là từ ksh, vì vậy có thể hữu ích khi viết các tập lệnh có thể chạy dưới cả hai, nhưng việc phát hiện vị trí của bash hoặc ksh trên một hệ thống không xác định có thể hơi khó khăn.

Vỏ không thể làm mọi thứ. Nếu bạn cần một ngôn ngữ phức tạp hơn, hai lựa chọn phổ biến hơn là Perl và Python (bất kỳ thứ gì khác đều bị bỏ xa như một ngôn ngữ kịch bản unix). Perl là ngôn ngữ kịch bản truyền thống và rất ít hệ thống Linux không nhúng, nhưng Python đang có được chỗ đứng (được tăng cường một phần bằng cách là ngôn ngữ kịch bản được đề xuất cho Ubuntu). Trong thế giới không phải là Linux, Perl là một phần của bản cài đặt cơ bản trên OSX và OpenBSD; nó là tùy chọn nhưng rất phổ biến được cài đặt trên FreeBSD và tùy chọn nhưng thường được cài đặt trên NetBSD.


1
"được tăng cường một phần bởi ..." Điều đó và được yêu cầu trong các hệ thống Fedora và RHEL.
Ignacio Vazquez-Abrams

Chủ yếu là đồng ý với tất cả những điều này. Chỉ một số điểm nhấn khác nhau: * một số phân phối dựa trên BusyBox nhưng không nhất thiết phải được nhúng (tôi sử dụng một, Alpine). (Được cấp, câu trả lời có nội dung "hầu như luôn luôn".) * BSD là một lớp lớn các hệ thống giống Unix mà bạn không thể giả sử bash theo mặc định. * dash có thể làm hầu hết mọi thứ bash có thể, đôi khi chỉ cần chăm sóc nhiều hơn. * Nếu bạn cần một ngôn ngữ phức tạp hơn, vâng, Perl và Python là những lựa chọn phổ biến nhất, nhưng awk thậm chí còn phổ biến hơn và phù hợp cho nhiều mục đích. Nó cũng thường được đánh giá thấp. Nhưng nó nhẹ hơn Perl và Python.
dubiousjim

2
Mặc dù vậy, một cảnh báo công bằng - FreeBSD đã loại bỏ Perl khỏi cài đặt mặc định của họ một thời gian trước đây. Ngoài ra, tôi không biết bất kỳ nhà phân phối nào khác không có Perl trong bản cài đặt cơ sở của họ.
TC1

@ TC1 Perl luôn là tùy chọn trên NetBSD. Nó nằm trong hệ thống cơ sở trên OpenBSD.
Gilles 'SO- ngừng trở nên xấu xa'

@dubiousjim Chỉ Linux (không được nhúng hoặc xấp xỉ đủ tốt trong thực tế) và OSX có bash trong cài đặt mặc định của chúng; * BSD có pdksh hoặc mksh và các hiệp hội thương mại có ATT ksh.
Gilles 'SO- ngừng trở nên xấu xa'

11

Theo thứ tự sẵn có:

  1. sh, nhưng dính vào các cơ sở do POSIX chỉ định.
  2. bash, nhưng đừng quên chỉ định rõ ràng trong shebang hoặc thay vào đó bạn có thể nhận được dấu gạch ngang.
  3. Con trăn. Hầu như tất cả mọi người sử dụng nó.
  4. Perl. Nhưng bạn có thể viết nó.

Sau đó, không ai thực sự quan tâm vì không có nhiều thứ bạn không thể làm chỉ với những thứ đó.


10
Tôi đã đặt PERL trước python, nó được cài đặt theo mặc định trong hầu hết các hệ thống linux.
terdon

4
Perl là # 3. bạn có thể viết nó, tiền thưởng! :)
Warren Young

2
Tôi đồng ý với @ignacio perl là # 4 và python là # 3. Lý do là rõ ràng. Tôi nghĩ Python là sự tiến hóa của perl.
bagavadhar

5
@ashwin: không, trăn không phải là một sự tiến hóa, hoặc thậm chí như, perl. perl là một ngôn ngữ của sysadmin cho sysadmin. python là một ngôn ngữ của các lập trình viên cho các lập trình viên. Sự khác biệt đó là rất quan trọng. Cả hai đều có công dụng của chúng và trong khi có thể có nhiều sự trùng lặp trong các trường hợp sử dụng, đối với một số tác vụ, perl là sự lựa chọn tốt hơn và đối với những người khác thì trăn rõ ràng là vượt trội.
cas

1
Ruby và PHP được lấy cảm hứng từ Perl. Python là kết quả của một thí nghiệm vật lý trong đó họ đã tạo ra các Anti-Perls trong một siêu tàu. (Tôi không có gì chống lại Python. Plusses và minuses, kìm và minuses.)
Warren Young

4

Thông thường, tôi sẽ nói sh.... nhưng vì bạn đã chỉ định Linux, tôi sẽ nói bash- nó được đảm bảo có mặt trên mọi hệ thống Linux xung quanh (tốt, ngoại trừ những hệ thống nhỏ bé tối nghĩa che khuất tôn sùng sự tối giản :).

Nếu bạn không phải quan tâm đến tính di động không phải của linux (và nếu bạn không cần phải chạy trên các bản phát hành nhỏ hoặc trong các thiết bị Linux nhúng như bộ định tuyến hộp nhựa), thì bạn cũng có thể sử dụng các cải tiến quan trọng mà nó cung cấp trên đồng bằng sh. Nếu không thì sử dụng sh.

Sau bash(và sh), ngôn ngữ kịch bản "phổ quát" tiếp theo dành cho Linux sẽ là một số phương ngữ awk- thường là mawkhoặc gawk. Nếu bạn gắn bó với awk đơn giản và tránh những câu chuyện phiếm, tập lệnh của bạn sẽ chạy tốt trên hầu hết mọi hệ thống Linux (nó có thể bị thiếu trên các bản phát hành nhỏ hoặc các thiết bị nhúng). Hầu hết các hệ thống Linux sẽ có cả hai mawkgawkcó sẵn, nhưng trên một số distro (ví dụ debian) mawkđược cài đặt theo mặc định và bạn phải tự cài đặt gawknếu muốn.

Tiếp theo sẽ là perl. AFAIK, ngôn ngữ perl cơ sở được cài đặt theo mặc định trên tất cả các bản phân phối Linux phổ biến, do đó làm cho nó trở thành một lựa chọn tốt. Thậm chí may mắn hơn, có rất ít phiên bản không tương thích với các bản phát hành perl5 (mặc dù perl 5.12 hoặc có thể là 5.14 cuối cùng đã có xung quanh để loại bỏ một số tính năng tối nghĩa đã bị phản đối trong khoảng 15 năm ... cảnh báo rộng rãi không sử dụng chúng) trừ khi phong cách mã hóa của bạn thực sự kỳ lạ và bạn muốn bỏ qua các cảnh báo "không làm điều đó" trong một thập kỷ, các tập lệnh perl của bạn sẽ chạy tốt ở hầu hết mọi nơi. Ngôn ngữ mạnh mẽ và mạnh mẽ và có thể làm mọi thứ awksedcó thể làm và hơn thế nữa. Với một chút nỗ lực nó có thể làm những việc màshtheo truyền thống là tốt cho quá (ví dụ: chạy các lệnh bên ngoài và sử dụng / đường ống đầu ra). Các thư viện perl tiêu chuẩn cũng khá toàn diện - không chỉ bao gồm những điều cơ bản.

Điều hấp dẫn duy nhất với perl là cũng có một thư viện mô-đun CPAN khổng lồ để làm bất cứ điều gì bạn có thể nghĩ đến (và nhiều hơn nữa có thể không bao giờ xảy ra với bạn) - và không phải tất cả chúng đều có sẵn trên mọi hệ thống với perl . Chúng thường có chất lượng rất cao nên dễ dàng có thói quen chỉ sử dụng chúng - nhưng nếu bạn sử dụng chúng, bạn sẽ phải đảm bảo rằng chúng đã được cài đặt. Nhiều mô-đun CPAN được đóng gói sẵn cho Linux và phần còn lại dễ dàng cài đặt bằng công cụ cpan (hoặc dh-make-perltrên debian / ub Ubuntu / etc để biến mô-đun CPAN thành gói .deb)

Tôi muốn có thể nói pythontiếp, nhưng tôi thực sự không thể. Có rất nhiều điều thích về python nhưng nó không được mặc định trên nhiều hệ thống Linux và thật lòng mà nói, đó là khả năng tương thích phiên bản (cả cho bản thân python và libs "tiêu chuẩn" của nó) là một sự hỗn loạn hoàn toàn. Một số distro thực hiện một nỗ lực tuyệt vời để phân loại mớ hỗn độn, và một số thì không. Không ai được giúp đỡ bởi thực tế là python về cơ bản là ngôn ngữ được lập trình viên viết cho các lập trình viên (trái ngược với sysadins) và dường như họ không nghĩ rằng hệ thống mã của họ sẽ được cài đặt hoàn toàn quan trọng .... mã của họ thực sự siêu đặc biệt nên họ không cần quan tâm đến những thứ nhàm chán như tích hợp vào các hệ thống hiện có.

(Đừng hiểu sai ý của tôi về sự mỉa mai của tôi ở đây - Tôi thực sự thích python như một ngôn ngữ, tôi chỉ ghét thực tế rằng phiên bản và quản lý phụ thuộc là một PITA. Nó giống như trở lại 20 năm trước thời đại săn bắn thủ công bị che khuất bit mã và bản vá để có được một cái gì đó được biên dịch và chạy trên * nix độc quyền của bạn


Tôi biết đây là một bài cũ, nhưng cách tốt nhất để phá vỡ này là để xác định các phiên bản trong công việc (ví dụ /usr/bin/python2, /usr/bin/python3).
Isiah Meadows

1

Tôi khuyên bạn nên theo hương vị ksh93 hoặc thậm chí POSIX và bạn luôn có thể sử dụng bash / zsh để chạy.

Và distro dựa trên Debian sử dụng mawk chứ không phải gawk như awk mặc định. Vì vậy, có tránh bổ sung gawk vì mawk là cách nhanh hơn.


0

Không bash. Viết thư cho một sh-POSIX gần giống như dấu gạch ngang hoặc tro. Đó sẽ là phổ quát nhất. Tôi không nghĩ có gì khác thậm chí là một đối thủ cạnh tranh gần gũi. (Và đây dường như là một câu hỏi thực tế, không phải là "ý kiến" như một trong những người bình luận phàn nàn.)

Nếu bạn cần thứ gì đó mạnh hơn một chút so với sh (ví dụ: nếu bạn muốn mảng kết hợp thực sự), hãy sử dụng awk. (Tránh các phần mở rộng gawk. Có nhiều phiên bản của awk, nhưng có phần lớn được chia sẻ.) Điều đó nên có sẵn gần như rộng rãi như sh.


1
awk-on-Linux là phổ biến rộng rãi; Tôi không thể nghĩ ra bất kỳ bản phân phối nào có biến thể khác theo mặc định.
Ignacio Vazquez-Abrams

5
Những biến thể của Linux không hỗ trợ bash?
Jonathan Leffler

1
Chắc chắn bashcó thể được cài đặt và chạy trên (gần) bất kỳ hộp Linux nào, nhưng nhiều người dùng debian sẽ chỉ cài đặt dashvà không muốn cài đặt bash.
William Pursell

6
@WilliamPursell Gói bash được gắn thẻ Essential trên Debian (tức là bạn phải trải qua các vòng để gỡ cài đặt, với nhiều cảnh báo rằng điều này sẽ làm hỏng hệ thống của bạn). Bash chỉ là phổ quát trên các hệ thống Linux không nhúng.
Gilles 'SO- ngừng trở nên xấu xa'

1
@JonathanLeffler: Những người được nhúng ngược lại chỉ có thể có Busybox.
Ốc cơ khí

0

Tôi muốn nói rằng tính khả dụng sẽ xếp hạng ở đâu đó theo thứ tự này:

  1. sh
  2. ôi
  3. Perl (Tôi vẫn chưa thấy * nix mà không có nó, bao gồm cả BSD)

Mặc dù Python có vẻ như là một ngôn ngữ tốt, tôi đã không sử dụng bất kỳ HĐH nào đi kèm với nó trong một bản cài đặt cơ bản, mặc dù rõ ràng là Ubuntu có thể?


0

Tôi tin rằng các chuyên gia ở đây đã cung cấp các đề xuất tuyệt vời sẽ giúp bạn quyết định. Khả năng sử dụng và tính sẵn có của các shell khác nhau đã được mô tả độc đáo trong các bài viết khác.

Một lưu ý khác, nếu tôi là bạn, tôi cũng sẽ xem xét mục tiêu mà tôi muốn đạt được với các kịch bản. Mỗi công cụ đều có những ưu điểm và nhược điểm riêng. Vì vậy, mặc dù tôi chủ yếu sử dụng Python, nhưng tôi sẽ không sử dụng nó trong mọi trường hợp.

Tôi có thể nghĩ ra một vài kịch bản và đề cập đến một số công cụ hữu ích cho chúng.

Tập tin FTP to-fro; xử lý chúng; gửi thông báo qua email; và v.v.

Trong trường hợp này, tốt hơn là nên gắn với vỏ (ví dụ: Bash) và sử dụng các tiện ích khác nhau (ví dụ ftp, cronmail). Đây là một trường hợp sử dụng điển hình trong nhiều công ty lớn.

Xử lý văn bản nhanh

Một lần nữa, vỏ. Các tiện ích như grep, awk, sed, pastevà những người khác là rất tiện dụng trong trường hợp này.

Xây dựng

Trong miền C / C ++, công cụ phổ biến cho việc này là make. Thế giới Java thích Apache ANT.

Triển khai và điều khiển từ xa

Hoặc là shell hoặc Python. Ví dụ, scprsync, tương ứng, sẽ khá hữu ích trong việc sao chép (các) tệp hoặc đồng bộ hóa các tệp.

Python, mặt khác, có một mô-đun rất hữu ích được đặt tên fabric. Điều này sẽ hữu ích cho các hoạt động phức tạp hơn, ví dụ: sao chép tệp, dừng một số quy trình, làm cho máy chủ lên và tương tự. Hơn nữa, Python cũng cung cấp một mô-đun, pipcó thể giải quyết các phụ thuộc được chỉ định bằng cách tải xuống và cài đặt các gói có liên quan.

(Lưu ý rằng các đề xuất ở trên không tập trung vào tính năng vỏ nhiều mà thay vào đó là các tiện ích khác nhau có sẵn.)


-1

Perl không có trong cơ sở FreeBSD, NetBSD hoặc DragonflyBSD, xin lỗi. OpenBSD có Perl trong cài đặt cơ sở. OS X ngày nay là một UNIX được chứng nhận và có thể được coi là một loại biến thể BSD ở một mức độ nào đó và nó có Perl, Python và Ruby trong cơ sở.

Nhiều UNIXen độc quyền không có Perl trong cơ sở của họ, ví dụ Solaris, AFAIK cũng không phải HP-UX hay IBM AIX ...


Tuyên bố của bạn về Solaris thiếu Perl là không chính xác. Perl là thành phần cốt lõi bắt buộc của Solaris ít nhất kể từ năm 2005 (Solaris 10).
jlliagre
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.