Điểm mạnh của Shell Scripting so với Python [đóng]


94

Tôi đã cố gắng học tập lệnh shell (bash) vài lần nhưng bị cú pháp đuổi đi. Sau đó, tôi tìm thấy Python và có thể làm hầu hết những điều mà một tập lệnh shell có thể làm bằng Python. Bây giờ tôi không chắc liệu mình có nên đầu tư thời gian vào việc học kịch bản shell nữa hay không. Vì vậy, tôi muốn hỏi:

Điểm mạnh của kịch bản shell là gì khiến nó trở thành một công cụ không thể thiếu so với Python?

Tôi không phải là quản trị viên hệ thống theo chuyên môn, nhưng tôi quan tâm đến việc thiết lập hệ thống Linux cho người dùng gia đình, do đó tôi nghĩ việc học kịch bản shell có thể trở nên cần thiết.

Câu trả lời:


82
  • Tập lệnh Shell có các ký hiệu đơn giản hơn để chuyển hướng I / O.
  • Đơn giản hơn là tạo đường dẫn từ các chương trình hiện có trong shell.
  • Tập lệnh Shell sử dụng lại toàn bộ chương trình.
  • Shell có sẵn trên toàn cầu (trên mọi thứ như Unix) - Python không nhất thiết phải được cài đặt.

'Đúng là bạn có thể làm mọi thứ bằng Python mà bạn có thể làm trong shell; Cũng đúng rằng có những thứ dễ trong Python nhưng lại khó trong shell (cũng như có những thứ dễ trong shell nhưng lại khó trong Python). Biết cả hai sẽ tốt nhất trong dài hạn.


16
1 và 2, điểm tốt. # 3 là một điểm yếu, vì nó dẫn đến rất nhiều chi phí mà Python có thể tránh được. # 4 phần lớn có thể không đúng sự thật. Python là một phần của hầu hết các bản phân phối Linux hiện nay.
S.Lott

1
@Svante: viết một vòng lặp shell đơn giản để thực hiện một số hoạt động bằng cách sử dụng các lệnh như "test" và "expr" và so sánh thời gian chạy với một tập lệnh Python sử dụng mô-đun "os". Các lệnh như test và expr thường liên quan đến việc fork một quy trình con để thực hiện công việc thực sự.
S.Lott

2
Tôi thấy điểm 3 là một lợi thế rất lớn, không phải là một bất lợi. Ví dụ: hãy xem xét việc thay đổi kích thước một thư mục chứa đầy hình ảnh bằng chương trình chuyển đổi.
Glenn

7
Cũng đáng chú ý liên quan đến # 4 là bashshell đặc biệt không có sẵn trên tất cả các bản phân phối linux, đặc biệt là các bản phân phối dành cho hệ thống nhúng và những bản khác đang chạy busyboxtệp thực thi. Các tập lệnh nhắm mục tiêu đến chính shell Bourne, bashtương thích ngược, sẽ chạy trên tất cả các hệ thống tuân thủ POSIX, tuy nhiên, ngôn ngữ đó bị hạn chế hơn nhiều so với ngôn ngữ được triển khai bởi bash.
trực giác

5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= đó là) có lẽ nhiều hơn / ít nhất /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
trực giác

54

"Điểm mạnh của kịch bản shell là gì khiến nó trở thành một công cụ không thể thiếu so với Python?"

Vỏ không thể thiếu. Bạn nghĩ tại sao có rất nhiều? bash, tcsh, csh, sh, v.v., v.v.,

Python một cái vỏ. Không phải là cái bạn sẽ sử dụng để chạy tất cả các lệnh, nhưng để viết script, nó rất lý tưởng.

Python là một phần tiêu chuẩn ít nhiều của tất cả các bản phân phối Linux.

Các vỏ truyền thống hơn làm quá nhiều thứ.

  1. Chúng có giao diện người dùng tiện dụng để chạy các lệnh. Điều này bao gồm các lệnh một dòng trong đó trình bao tìm kiếm PATH của bạn, phân tách và thực thi chương trình được yêu cầu. Nó cũng bao gồm đường ống, trình tự và các chương trình đồng thời (sử dụng ;, |&) cũng như một số chuyển hướng (sử dụng ><).

  2. Chúng có một khả năng giống như ngôn ngữ lập trình nhỏ bé để chạy các tập lệnh. Ngôn ngữ này khá khó sử dụng và cực kỳ kém hiệu quả. Hầu hết các câu lệnh bằng ngôn ngữ này yêu cầu thêm một hoặc nhiều quy trình bổ sung, gây lãng phí thời gian và bộ nhớ.

Chạy các chương trình từ shell, chuyển hướng stderr đến một tệp nhật ký và điều đó là tốt. Làm điều đó trong shell.

Hầu hết mọi thứ khác có thể được thực hiện hiệu quả hơn và rõ ràng hơn như một tập lệnh Python.

Bạn cần cả hai . Tuy nhiên, bạn không bao giờ nên viết một tập lệnh với câu lệnh if hoặc vòng lặp bằng ngôn ngữ shell truyền thống.


1
@intuited. A) Sự gia tăng của các lớp vỏ khác nhau chứng tỏ số lượng các tính năng tích tụ thành "lớp vỏ"; nó không phải là vai trò thiết yếu, nhưng nó là tất cả cho các tính năng. B) Trình thông dịch python là một trình bao unix thích hợp, nó sử dụng # !. C) Một ifcâu lệnh shell "đơn giản" thường liên quan đến việc chạy testchương trình. Shell là một ngôn ngữ lập trình thô sơ về mọi mặt.
S.Lott

4
@S. Lott: Có vẻ như một số bất đồng ngữ nghĩa nằm trong mạch ở đây. Định nghĩa của tôi về UNIX shell sẽ là một trình thông dịch có ngôn ngữ chủ yếu hướng tới việc điều khiển, ở mức cao, hoạt động của hệ thống UNIX. Theo định nghĩa này, một trình bao thuộc một số loại chắc chắn cần thiết cho hoạt động của hệ thống UNIX và Python không đủ điều kiện. Bạn định nghĩa thuật ngữ đó như thế nào?
trực giác

1
@ S.Lott: Tôi không phải là một người yêu thích cú pháp được sử dụng trong kịch bản shell truyền thống, nhưng tôi thấy nó khá dễ sử dụng và phù hợp trong nhiều tình huống mà mục tiêu chính là kiểm soát các quy trình và luồng đầu ra của chúng. Điều này thường đòi hỏi phải đưa ra quyết định và lặp đi lặp lại. Các shell hiện đại ( bash, ít nhất) có các nội trang để xử lý việc ra quyết định (ví dụ: testlà một bashnội trang, ngoài các cấu trúc linh hoạt hơn). Nó chắc chắn có điểm yếu, nhưng cũng có điểm mạnh của nó. Nó cũng đáng để tìm hiểu chi tiết vì nó là một mô hình rất khác so với các loại ngôn ngữ khác.
trực giác

1
@intuited: "thấy nó khá hữu dụng" là một lời chào cho kỹ năng của bạn, không phải là ngôn ngữ thô thiển. Python có thể được sử dụng nhiều hơn bởi những người không có kỹ năng tốt.
S.Lott

3
@ S.Lott: Thật thú vị, bạn có một triết lý rất khác với tôi. Tôi cảm thấy rằng thiết kế và hoạt động về cơ bản là gà và trứng. Điều này có nghĩa là một kịch bản shell là một chương trình chạy các chương trình. Nhiều chương trình trong số đó ban đầu được thực hiện dưới dạng các tập lệnh shell ngày càng phức tạp. Tại một số thời điểm, nó trở nên đáng giá, có thể là vì lợi ích của tính hiệu quả như tính mô-đun, vì một số trong số chúng được viết lại bằng C và sau đó là Python. Ví dụ: tại một số điểm cat "$1" | ssh "$2" "cat - >\"$1\""sanh scp. Họ biết cách tốt nhất để thiết kế nó vì họ đã sử dụng nó.
trực giác

31

Shell làm cho các hành động thông thường và đơn giản trở nên thực sự đơn giản, với chi phí làm cho những thứ phức tạp hơn trở nên phức tạp hơn nhiều.

Thông thường, một tập lệnh shell nhỏ sẽ ngắn hơn và đơn giản hơn chương trình python tương ứng, nhưng chương trình python sẽ có xu hướng chấp nhận các sửa đổi một cách dễ dàng, trong khi tập lệnh shell sẽ có xu hướng ngày càng ít bảo trì hơn khi mã được thêm vào.

Điều này dẫn đến hậu quả là để có năng suất hàng ngày tối ưu, bạn cần shell-scripting, nhưng bạn nên sử dụng nó chủ yếu cho các kịch bản tạm thời và sử dụng python ở mọi nơi khác.


14

Bạn không thể làm gì với các tập lệnh shell mà bạn không thể làm với python. Ưu điểm lớn nhất của shell script là bạn sử dụng các lệnh tương tự như khi bạn sử dụng shell, vì vậy nếu bạn là người dùng nhiều shell, shell script tại một số điểm sẽ trở thành một cách rất nhanh chóng và dễ dàng để tự động hóa công việc shell của bạn. .

Tôi cũng thấy việc xử lý các đường ống dữ liệu trong các tập lệnh shell dễ dàng hơn so với trong python, mặc dù điều đó hoàn toàn có thể thực hiện được từ python.

Và, cuối cùng, bạn không phải kích hoạt thêm một interpeter để chạy các tập lệnh shell, mang lại cho bạn một lợi thế rất nhỏ, nhưng đôi khi có thể đáng chú ý về tốc độ và sử dụng bộ nhớ.

Nhưng một lần nữa, các tập lệnh Python dễ bảo trì hơn rất nhiều, tôi đang cố gắng chuyển từ các tập lệnh shell xấu xí lớn sang các tập lệnh Python vì lý do đó. Việc xử lý ngoại lệ và QA với Python cũng dễ dàng hơn.


9

người ta không cần phải học kịch bản shell, như tất cả các câu trả lời trước đó chỉ ra; nhưng học không bao giờ là một điều xấu. nó thực sự là một câu hỏi về các ưu tiên cá nhân. rất khó để người khác nói cho bạn biết điều gì được và không đáng để bạn dành thời gian.

hầu hết các lập trình viên nhận thấy rằng việc học các ngôn ngữ mới mỗi lần trở nên dễ dàng hơn. (điều này cũng đúng với các ngôn ngữ tự nhiên.) và bạn bắt đầu càng sớm thì càng tốt.

cộng thêm: đã học một ngôn ngữ cho phép bạn vượt qua những hạn chế của nó từ một vị trí hoàn toàn hiểu biết và quen thuộc. Điều này có thể sẽ không khiến bạn thoải mái, nhưng có thể kiếm được cho bạn một ly bia từ những người đồng nghiệp của bạn!


8

Tôi đồng ý với hầu hết các câu trả lời trước đây. Tôi coi các lệnh shell phù hợp nhất để thực hiện các tác vụ hướng hệ thống tệp (sao chép và di chuyển tệp, grep, v.v.). Shell tốt hơn, theo ý kiến ​​của tôi, nếu bạn phải đọc và ghi vào tệp, vì một >>file.txtchuyển hướng duy nhất sẽ gắn vào tệp ngay lập tức, thay vì cần, chẳng hạn file=open('file.txt','a'); file.write(), v.v.

Hiện tại, để sử dụng cá nhân, tôi kết hợp cả hai, tạo một tập lệnh python và gọi os.system ('command') hoặc os.popen ('command') mỗi khi một số hành động trong shell dễ dàng hơn trong python.


6

Vỏ có sẵn ở khắp mọi nơi. Nếu bạn gắn bó với một bộ chức năng di động tương đối cơ bản, các tập lệnh của bạn có thể chạy trên điện thoại di động, bộ định tuyến không dây, DVR, netbook, máy trạm, máy chủ sắt lớn, v.v. Python không nhất thiết phải có sẵn trên nhiều hệ thống và tùy thuộc vào môi trường, có thể khó cài đặt nó.

Học một số kịch bản shell cũng có thể giúp bạn tìm hiểu một số thủ thuật về dòng lệnh, vì dòng lệnh chính là shell. Nó cũng tốt cho việc sử dụng một số dòng lệnh khá dài và phức tạp, và chuyển đổi nó thành một tập lệnh tổng quát hơn sau khi bạn nhận ra mình sẽ cần thêm một số dòng lệnh.

Vỏ cũng có một số tính năng khá mạnh mẽ; đường ống là một cấu trúc điều khiển thực sự thú vị mà chỉ có nguồn gốc cho shell, theo như tôi biết.


5

Một điều khác cần xem xét khi chọn các tập lệnh shell của Python là phiên bản Python sẽ chạy trên các máy đích. RHEL5 (tên một) sẽ tồn tại trong một thời gian dài. RHEL5 bị mắc kẹt với Python 2.4. Có rất nhiều thư viện đẹp phụ thuộc vào chức năng được thêm vào Python hậu 2.4.

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.