Tập lệnh thay thế cho tập lệnh shell Bash


16

Tôi vừa chuyển sang một máy trạm UNIX. Ký ức về các tập lệnh shell Bash của tôi đã mờ dần kể từ khi đi học và tôi thấy cú pháp rất khó hiểu. Tôi tự hỏi những ngôn ngữ kịch bản khác được sử dụng để tự động hóa các tác vụ. Hai cái phổ biến nhất mà tôi đã nghe nói là Perl và Python.

  1. Ngôn ngữ kịch bản nào được sử dụng rộng rãi nhất bởi các cửa hàng trong thế giới thực?
  2. Ngôn ngữ kịch bản nào gần giống với cú pháp C / C ++ nhất?
  3. Có một ngôn ngữ kịch bản khác mà tôi không biết?

Cảm ơn bạn đã giúp đỡ,

Scott


2
Đây có lẽ nên là một wiki cộng đồng.
EBGreen

2
Tôi thực sự sử dụng PHP cho hầu hết các nhiệm vụ hệ thống. Tôi sẽ đưa ra một câu trả lời thích hợp với điều này sớm. Nó có rất nhiều thư viện được xây dựng, rất tiện dụng.
Kyle Hodgson

Các ngôn ngữ dành cho Shell làm điều gì đó mà các ngôn ngữ khác có thể không có; Đó là quản lý và kiểm tra tất cả các quy trình con đệ quy từng sinh sản. Blog quảng cáo Phusion Pasbah giải thích lý do chi tiết: phusion.github.io/baseimage-docker Tóm lại, các tập lệnh của bạn được viết bằng lang-x có thể không xử lý các thói quen tắt máy đúng cách. Điều này là hoàn toàn ổn miễn là bạn chạy chúng như những đứa trẻ của một quá trình vỏ thực sự. Từ chối trách nhiệm, tôi không phải là chuyên gia. Thông tin này chỉ theo sự hiểu biết tốt nhất của tôi có thể là thiếu sót.
ThorSummoner

Câu trả lời:


12

Ở một mức độ nào đó, đó là vấn đề sở thích cá nhân. Perl và Python chắc chắn ở trên đó về mức độ phổ biến.

Để trả lời hai trong số ba câu hỏi của bạn, mặc dù:

  1. Tôi đoán rằng bash được sử dụng rộng rãi nhất, có thể theo sau là perl. Chỉ cần đoán mặc dù, dunno nếu bất cứ ai đã làm một cuộc khảo sát. :)
  2. Có rất nhiều ngôn ngữ kịch bản ngoài kia. :)

Đề nghị của tôi là Python mặc dù. Thật dễ dàng để đọc và viết, vô cùng mạnh mẽ và có rất nhiều tài nguyên hữu ích trên web để tìm hiểu nó, chưa kể đến mã mà bạn có thể sao chép và tái mục đích.


1
Tôi thứ hai. Tôi thấy Python dễ học và có thể làm bất cứ điều gì tôi ném vào nó vì nó đã ở trong hệ điều hành cũ / 2 ngày với REXX.
slovon

3
+1 cho python ... sức mạnh của C trong ngôn ngữ kịch bản. Bạn có thể làm cho các tập lệnh của mình đơn giản hoặc phức tạp như bạn muốn;)
KFro

1
trên các hệ thống không phải NT, mô-đun python shgiúp sử dụng python làm ngôn ngữ kịch bản lệnh shell; Tuy nhiên, nếu bạn gặp phải các trường hợp cạnh (như đa xử lý), bạn sẽ phải học mô-đun quy trình con mà tôi cho đến ngày nay rất khó để sử dụng.
ThorSummoner

5

Perl và Python là câu trả lời rõ ràng; nhưng mỗi người trong số họ được sử dụng để hoàn thành các nhiệm vụ khác nhau:

  1. Bash - Bàn tay dễ học nhất. Với các tập lệnh Bash, bạn chạy các lệnh và thao tác đầu ra.
  2. Python - Dễ học thứ hai. Python hữu ích hơn Bash vì bạn có thể sử dụng Python để viết các chương trình đầy đủ và được cộng đồng hỗ trợ tốt. Python cũng cực kỳ dễ đọc và dễ dàng chỉnh sửa nhiều tháng sau đó.
  3. Perl - Tốt nhất trong ba (đối với kịch bản), nhưng dễ dàng là đường cong học tập dốc nhất. Có hỗ trợ biểu thức chính quy rất tốt (đó là lý do chính mà ngày nay nó vẫn được sử dụng) và có thể bạn sẽ gặp rất nhiều tập lệnh Perl theo thời gian. Vấn đề chính với Perl là khả năng đọc mã - vài tháng sau khi bạn viết mã, bạn sẽ không thể tìm ra nó làm gì. Vì vậy, bạn tốt hơn bình luận nặng nề.
  4. Awk / Sed - Cả hai đều rất hữu ích, nhưng cả hai đều rất khó học. Tôi khuyên bạn nên giải quyết những vấn đề cuối cùng này, trừ khi bạn giỏi về các mẫu.

Liên quan đến cái nào sẽ học ngay bây giờ (vì có lẽ bạn không biết ai trong số họ), tôi sẽ học Python. Đó là cách đơn giản và hữu ích nhất để biết.

Và đối với câu trả lời cho câu hỏi của bạn:

Ngôn ngữ kịch bản nào được sử dụng rộng rãi nhất bởi các cửa hàng trong thế giới thực?

Tất cả trong số họ, nhưng tôi tưởng tượng rằng Perl có một chút lợi thế ở đây (vì nó được sử dụng trong quản trị hệ thống lâu hơn nhiều).

Ngôn ngữ kịch bản nào gần giống với cú pháp C / C ++ nhất?

Perl

Có một ngôn ngữ kịch bản khác mà tôi không biết?

Ruby, Tcsh / Csh, http://en.wikipedia.org/wiki/Interprave_lingu


2
Nếu bạn dành thời gian cho perl, bạn có thể viết perl hoàn toàn dễ đọc. Những người viết mã spaghetti quá nhanh để đổ lỗi cho Perl về những thất bại của họ.
Cian

1
Tôi chỉ nói dựa trên kinh nghiệm như một sysadmin; Tôi đã phải duy trì mã người khác đã viết mà gần như không thể đọc được. Thông thường tôi sẽ chỉ viết lại mã trong Python.
Michael Pobega

3

awk cho các công việc nhỏ, python cho nhiều hơn oneliners.

Python (nếu bạn không sử dụng API cụ thể và những thứ phụ thuộc nền tảng khác) có một "thư viện tiêu chuẩn" phong phú có sẵn trên tất cả các nền tảng nơi bạn sử dụng phiên bản python. Điều này rất hay vì bạn có thể sử dụng lại các tập lệnh của mình một cách dễ dàng và có nghĩa là kiến ​​thức của bạn là một khoản đầu tư tốt ngay cả khi bạn thay đổi nền tảng của mình.

Trong công ty của chúng tôi, chúng tôi sử dụng python cho tất cả các kịch bản, giám sát, ... và java cho Ứng dụng và chúng tôi khá giả trong môi trường không đồng nhất.


1

Tôi có thể nói rằng perl và python có lẽ là hai lựa chọn thay thế tốt nhất. Bạn có thể làm rất nhiều với sed và awk là tốt.


1

Sh (vỏ bourne), grep, awk và sed luôn là một điều tốt để có được một lần nữa. Perl là tuyệt vời nếu bạn không có nhiều văn bản regexing và khả năng duy trì không quan trọng (không nói rằng điều đó là không thể). Con trăn; nếu khả năng đọc là quan trọng với bạn. Sở thích của tôi là Python nhưng tất cả các công cụ này đều tốt cho hầu hết mọi thứ bạn ném vào nó. Bạn có thể muốn xem xét lại yêu cầu cú pháp c / c ++ của mình, tiếp tục bị mắc kẹt trong đó sẽ không giúp bạn lâu dài.


Cảm ơn Martin. Tôi đã nhận thấy (từ các mẫu trên web), rằng Perl có sự tương đồng đáng chú ý với PHP (mặc dù tôi chắc chắn đó là Perl trước PHP, theo lịch sử). Đây có phải là một tuyên bố công bằng?
Scott Davies

PHP 1.0 là một tập lệnh perl, vì vậy nó không phải là ngẫu nhiên :)
Bill Weiss

1

Nếu bạn đang muốn học một cái gì đó từ đầu, có lẽ tốt nhất là (học lại) bash.

Ngoài ra, perl và python là phổ biến ngày nay; Tôi là một phần của perl, nhưng phong cách kịch bản perl của tôi đã không thay đổi nhiều kể từ khi Perl 4 ra mắt.

Tôi không biết về bất kỳ ngôn ngữ kịch bản "giống như cú pháp" nào.


1

Xin vui lòng, nếu chỉ vì tài nguyên đáng kinh ngạc của CPAN ( http://search.cpan.org/ ). Lợi ích của việc sử dụng ngôn ngữ kịch bản với cộng đồng đóng góp lớn như vậy là bạn khó có thể tự mình phát minh ra thứ gì đó.

Perl cũng có lợi ích là phức tạp như bạn cần cho tình huống hiện tại. Bạn có thể coi nó như một ngôn ngữ kịch bản đơn giản để quản trị nhanh hoặc tập lệnh đơn mục đích, nhưng bạn có thể sử dụng các khái niệm hướng đối tượng hoặc hệ thống đối tượng meta mở rộng khi bạn muốn tạo các ứng dụng lớn hơn, dễ bảo trì (như trình nền, máy chủ, máy khách).

Sự khác biệt giữa các ngôn ngữ kịch bản thôi không đủ nghiêm trọng để chọn một người chiến thắng rõ ràng, nhưng chủ yếu bạn nên xem bạn sẽ dễ dàng tìm thấy thông tin về các chủ đề bạn quan tâm đến mức nào.

Cú pháp Perl cũng có thể rất gần với C, miễn là bạn có thể giải quyết vấn đề thiếu gõ và sigils; sử dụng perl nâng cao sẽ đến một cách tự nhiên khi cuối cùng bạn học được những điểm mạnh của ngôn ngữ.

Và đối với những người không tán thành ở mặt trước dễ đọc: bạn có thể viết mã khó đọc bằng bất kỳ ngôn ngữ nào. Nếu bạn nhìn lại mã của mình từ 4 tháng trước và không thể hiểu nó, bạn đã làm sai điều gì đó.

ps Bài đăng này chứa đầy các liên kết đến các mô-đun thân thiện quản trị khác nhau trên CPAN, nhưng rõ ràng người dùng mới chỉ có thể đăng một liên kết, vì vậy hãy sử dụng liên kết CPAN đó để tìm kiếm những thứ như 'CVS' 'SVN' 'Cron' và 'Moose' (một hệ thống đối tượng rộng lớn)



1

[để được tư vấn về kịch bản chung, hãy xem các câu trả lời khác]

Câu trả lời này là về việc sử dụng các chương trình dòng lệnh và cả chuỗi lớn của chúng.

Để chạy các chuỗi chương trình CLI và có lẽ nhiều chuỗi theo trình tự, bash là dễ nhất. Perl có thể làm như vậy nhưng ngôn ngữ khó học hơn nhiều và phức tạp hơn nhiều, và như nhiều người đã chỉ ra, thật dễ dàng để viết Perl dễ hiểu.

Nếu bạn đang lặp lại các tệp và tham số, bash là cách dễ nhất để bạn có thể tạo nguyên mẫu trong trình bao, sau đó sao chép vào tập lệnh và thêm một số mảng và vòng lặp với chi phí tối thiểu.

Ví dụ về những gì tôi muốn nói:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

Trong bash, thật dễ dàng để bọc nó trong một vài vòng trên một số tham số đó. Tuy nhiên , mã trở nên khó đọc khi tập lệnh dài hơn vài chục dòng. --- hãy tưởng tượng 30 bộ lệnh (mỗi dòng vài dòng) cho ba mươi ô dữ liệu khác nhau ---

Perl và Python có thể tốt hơn cho các tập lệnh lớn vì chúng có cú pháp sạch hơn cho vòng lặp và biến, nhưng các lệnh bash phải được tạo dưới dạng chuỗi, chạy dưới dạng quy trình con và stdin, stdout bị bắt. Nó có thể được thực hiện, nhưng nó không thể thay thế hoàn toàn môi trường vỏ tự nhiên.

Nếu shell có ngôn ngữ tốt hơn thì tất cả sẽ tránh được.


0
  1. Được sử dụng nhiều nhất: Perl, chủ yếu là vì lý do lịch sử. Python có sẵn rộng rãi trong tất cả các bản phân phối Linux và BSD (thậm chí nó được cài đặt trên Mac OSX) và rất dễ học / lập trình. Tất nhiên, một khi bạn nhận được cú pháp, Bash đơn giản hơn cho hầu hết mọi thứ bạn có thể làm ở dòng lệnh. Rốt cuộc, nó dòng lệnh.

    • Cú pháp C: có csh , nhưng bạn có thể dễ dàng cài đặt TCC và sử dụng C thực sự làm ngôn ngữ kịch bản, được biên dịch từ nguồn trong thời gian ngắn hơn so với các ngôn ngữ khác khởi động.

    • ngôn ngữ kịch bản khác: rất nhiều! Lua , Ruby , JavaScript ...


0

Bạn nên sử dụng kết hợp tất cả những nơi phù hợp. Tôi thực sự không thích perl (khả năng đọc), nhưng nó tốt cho rất nhiều thứ. Mặt khác, Python là một cái gì đó mới đối với tôi về mặt quản trị hệ thống, cho đến khi tôi phải quản lý (và vẫn phải) một vài máy KVM. Bắt đầu, dừng, lưu, tải, di chuyển tất cả các máy đó thông qua tập lệnh đã trở thành hiện thực sau 1 giờ lộn xộn với các ràng buộc trăn của libvirt.

Cuối cùng nhưng không kém phần quan trọng, tôi sẽ không sử dụng perl hoặc python nếu tôi phải nói, đổ tất cả cơ sở dữ liệu từ máy chủ mysql mỗi đêm (mỗi cơ sở dữ liệu trong tệp kết xuất của riêng nó), tar chúng và rsync cho một số máy chủ khác. Tại sao ? Bởi vì nó nhanh hơn và dễ dàng hơn để viết nó trong bash :)

Cuối cùng, bạn nên sử dụng bất kỳ ngôn ngữ nào phù hợp nhất với nhiệm vụ hiện tại của bạn và không chỉ sử dụng một ngôn ngữ kịch bản nhất định chỉ vì bạn thích nó nhất.


0

Tôi thích hồng ngọc. Thật đơn giản và dễ lập trình. Có một cuốn sách tuyệt vời về quản trị hệ thống bằng ruby .

Ruby được sử dụng trong một số hệ thống quản lý cấu hình (capistrano, đầu bếp, con rối) và phiên bản cuối cùng của metasploit.

Bạn có thể sử dụng rush , một sự thay thế cho shell Unix bằng cú pháp ruby ​​và làm những việc như thế này:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

Cảm ơn chmeee. Tôi không biết bạn có thể sử dụng Ruby cho sysadmin - tôi luôn nghĩ rằng nó là trung tâm web. Tôi đang tìm kiếm một cái gì đó được sử dụng tại hầu hết các tổ chức. Có công bằng không khi nói rằng Ruby cho sysadmin vẫn còn quá khó chịu?
Scott Davies

1
Shell / Perl là hai ngôn ngữ duy nhất mà bạn có thể tìm thấy được cài đặt ở mọi nơi. Python có lẽ là phổ biến nhất tiếp theo, với ruby ​​chạy một phần tư rất xa (thực sự, có thể là thứ năm, sau awk).
Cian

@ScottDavies PHP và ASP.net là những ngôn ngữ tập trung vào web duy nhất mà tôi biết; ngay cả Javascript được thiết kế để chạy độc quyền trên web đã trưởng thành trong quá khứ là thiếu sót để xác thực mẫu. Tuy nhiên, bạn có thể gửi html với bất kỳ ngôn ngữ nào, thậm chí là bash rõ ràng.
ThorSummoner

0

Ví dụ về một lớp lót của Ruby:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

Tôi sẽ sử dụng ruby.

So với sh, nó hiện đại và mạnh mẽ.

So với python, nó là tính nhất quán, một phiên bản, một trình quản lý gói. Và tôi không thích cú pháp thụt lề.

So với Perl, một chút trường học cũ và cú pháp quá phức tạp đối với tô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.