2009-04-28 54 views
76

Tôi đã cố gắng học shell (bash) scripting vài lần nhưng bị đẩy đi bởi cú pháp. Sau đó, tôi đã tìm thấy Python và có thể thực hiện hầu hết những thứ mà một kịch bản lệnh shell có thể thực hiện bằng Python. Tôi bây giờ không chắc liệu tôi có nên đầu tư thời gian của mình vào việc học kịch bản shell nữa không. Vì vậy, tôi muốn hỏi:Điểm mạnh của Shell Scripting so với Python

Thế mạnh của kịch bản lệnh vỏ làm cho nó trở thành công cụ không thể thiếu so với Python là gì?

Tôi không phải là quản trị hệ thống theo nghề nghiệp, 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ĩ rằng việc học kịch bản shell có thể trở nên cần thiết.

Trả lời

65
  • Tạo tập lệnh shell có ký hiệu đơn giản hơn cho chuyển hướng I/O.
  • Đơn giản hơn là tạo đường ống ra khỏi các chương trình hiện có trong trình bao.
  • Shell scripting reuses 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 trình bao; 'tis cũng đúng là có những thứ dễ dàng trong Python mà là khó trong vỏ (cũng giống như có những thứ dễ dàng trong vỏ nhưng khó trong Python). Biết cả hai sẽ là tốt nhất trong dài hạn.

+14

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 có thể phần lớn là không đúng sự thật. Python bây giờ là một phần của hầu hết các bản phân phối Linux. –

+0

Tôi không thấy chi phí. Bạn có một số con số? – Svante

+0

Về Python - có, nó là khá nhiều phổ biến trên Linux; tất cả thế giới không phải là một hộp Linux. Có nói rằng, nó có sẵn cho mọi nền tảng giống Unix. Tuy nhiên, trên hộp Solaris của tôi, nó được cài đặt phần nào ra khỏi con đường (/ usr/sfw/bin/python); Tôi chỉ tìm thấy thư mục ở tất cả trong năm qua hoặc lâu hơn. –

10

Bạn không thể làm gì với các tập lệnh shell mà bạn không thể thực hiện với python. Lợi thế lớn của các kịch bản lệnh shell là bạn sử dụng các lệnh giống như khi bạn sử dụng shell, vì vậy nếu bạn là người dùng shell nặng, shell scripting sẽ trở thành một cách nhanh chóng và dễ dàng để tự động hóa shell của bạn công việc.

Tôi cũng tìm thấy nó dễ dàng hơn để đối phó với các đường ống của dữ liệu trong các kịch bản shell hơn trong python, mặc dù nó 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 kịch bản lệnh shell, cho bạn một lợi thế về tốc độ và sử dụng bộ nhớ rất nhỏ, nhưng đôi khi có thể nhận thấy.

Nhưng sau đó một lần nữa, các tập lệnh Python có thể duy trì được nhiều hơn, tôi đang cố di chuyển từ các kịch bản shell xấu đến 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.

5

Vỏ có sẵn ở 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, 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à các loại tương tự. Python không nhất thiết phải được đưa ra khỏi hộp 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ó.

Tìm hiểu một số tập lệnh vỏ cũng có thể giúp bạn tìm hiểu một số thủ thuật dòng lệnh, vì dòng lệnh là, tốt, trình bao. Nó cũng tốt cho một số dòng lệnh khá dài và phức tạp, và chuyển đổi thành một kịch bản tổng quát hơn sau khi bạn nhận ra bạn sẽ cần nó một số chi tiết.

Vỏ cũng có một số tính năng khá mạnh; các đường ống dẫn là một cấu trúc điều khiển thực sự thú vị, chỉ có bản địa của trình bao, theo như tôi biết.

45

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

Vỏ không phải là không thể thiếu. Tại sao bạn nghĩ có rất nhiều? Bash, tcsh, csh, sh, vv, vv,

Python một vỏ. Không phải là một trong những bạn 'd sử dụng để chạy tất cả lệnh, nhưng đối với kịch bản, đó là lý tưởng.

Python là một phần hơn hoặc ít hơn tiêu chuẩn của tất cả các distro của Linux.

các vỏ truyền thống 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, forks và thực thi chương trình được yêu cầu. Nó cũng bao gồm các đườ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ó khả năng giống như ngôn ngữ lập trình nhỏ để chạy 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 trong ngôn ngữ này đều yêu cầu một hoặc nhiều quy trình bổ sung, lãng phí thời gian và bộ nhớ.

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

Hầu như 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 kịch bản với các câu lệnh if hoặc các vòng lặp trong một ngôn ngữ shell truyền thống.

+0

-1. A) sự hiện diện của sự gia tăng của các vỏ khác nhau phục vụ để chứng thực, thay vì làm giảm đi, sự khẳng định rằng một vỏ của một số giống là điều cần thiết để sử dụng một hệ thống UNIX. B) OP quy định "vỏ UNIX", không chỉ "vỏ". Trình thông dịch Python không phải là một trình bao UNIX, nó là một "vỏ" Python. Ngôn ngữ lập trình Python được định hướng để lập trình thủ tục và thao tác dữ liệu; các ngôn ngữ shell được định hướng để thực hiện các chương trình và thao tác đầu ra của chúng. C) Điểm số 2 của bạn có thể đúng nếu không có câu lệnh nào trong kịch bản lệnh là các câu lệnh dòng điều khiển như 'if' hoặc' while'. – intuited

+1

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

+3

@S. Lott: Dường như một số sự bất bình đẳng ngữ nghĩa là trong mạch điện ở đây.Định nghĩa của tôi về một vỏ UNIX sẽ là một thông dịch viên có ngôn ngữ chủ yếu hướng tới việc kiểm soát, ở mức độ cao, hoạt động của một hệ thống UNIX. Theo định nghĩa này, một vỏ của một số loại là chắc chắn cần thiết cho hoạt động của một hệ thống UNIX, và Python không đủ điều kiện. Bạn định nghĩa thuật ngữ đó như thế nào? – intuited

25

Vỏ làm cho hành động phổ biến và đơn giản thực sự đơn giản, với chi phí làm cho những thứ phức tạp hơn phức tạp hơn nhiều. Thông thường, một kịch bản 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 sửa đổi một cách duyên dáng, trong khi kịch bản shell sẽ có xu hướng ít được bảo trì hơn khi mã được thêm vào.

Điều này có hậu quả là cho 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 script throwaway, và sử dụng python ở mọi nơi khác.

7

người ta không phải học kịch bản shell, vì tất cả các câu trả lời trước đó đều cho biết; nhưng việc học không bao giờ là đ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ì là và không đáng để dành thời gian của bạn.

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

cộng với: đã học được một ngôn ngữ cho phép bạn phân tích quá mức các giới hạn của nó từ một vị trí hoàn chỉnh về kiến ​​thức và sự quen thuộc. điều này có thể sẽ không khiến bạn bị sa thải, nhưng có thể kiếm được một ly bia từ bạn bè của bạn!

6

Tôi đồng ý với hầu hết các câu trả lời trước. Tôi xem xét các lệnh shell phù hợp nhất để thực hiện các tác vụ định hướng hệ thống tập tin (sao chép và di chuyển các 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 chuyển hướng đơn >>file.txt sẽ thêm vào tệp ngay lập tức, thay vì cần, hãy nói, 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 ra một kịch bản python và gọi os.system ('command') hoặc os.popen ('command') mỗi khi một số hành động dễ dàng hơn trong shell hơn trong python.

3

Một điều cần xem xét khi chọn kịch bản shell của Python là phiên bản Python sẽ chạy trên các máy đích. RHEL5 (để đặt 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 post-2.4.

Các vấn đề liên quan