Shell có các tính năng chuyên dụng để làm việc với các tệp và nhận dữ liệu từ chương trình này sang chương trình khác (giả sử rằng dữ liệu là văn bản). Đối với các tác vụ đó, tập lệnh shell có thể ít cồng kềnh hơn so với ngôn ngữ tập lệnh như Python.
Shell scripting cũng có lợi thế là các lệnh bạn sử dụng về cơ bản giống với các lệnh bạn sử dụng từ dòng lệnh - vì vậy nếu bạn có thể làm gì đó trong shell, bạn sẽ đi được hơn một nửa so với kịch bản hoạt động tương tự.
Ví dụ ở đây là một tập lệnh bash di chuyển tất cả các tệp PNG từ thư mục hiện tại sang một thư mục được chỉ định.
#!/usr/bin/sh
mv *.png $1
Đây là phiên bản Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Bạn sẽ nhận thấy:
- Tập lệnh bash dài bằng một phần ba so với Python nếu bạn đếm các dòng (không bao gồm dòng shebang) - thậm chí ít hơn theo số ký tự
- Tập lệnh Python yêu cầu ba thư viện được nhập, trong khi mọi thứ bạn cần cho tác vụ này thực sự có sẵn trong bash
- Các Python script đòi hỏi một vòng lặp rõ ràng để di chuyển các tập tin, trong khi đó là một phần của ngữ nghĩa của các
mv
lệnh trong bash
- Tập lệnh bash có thể chạy nhanh hơn - có thể bạn sẽ gọi nó từ bash và bạn có thể sử dụng
source
để chạy nó trong cùng một phiên bản của trình bao
glob.iglob("./*.png")
chỉ là một câu nói miệng *.png
Nếu bạn muốn viết một thao tác đường ống cơ bản bằng Python, bạn sẽ phải kinh ngạc về độ dài. (Tất nhiên, một số thứ, như đường ống xuyên qua grep
, có thể được thay thế bằng mã Python thay vì sử dụng chương trình bên ngoài, vì vậy bạn thường không cần phải sử dụng nhiều như vậy.)
Như một ví dụ, tôi đã từng phải viết một thói quen kiểm tra xem mỗi tên tệp trong một thư mục cụ thể là bao lâu. Nếu chúng dài hơn được hỗ trợ bởi một HĐH cụ thể, chúng phải được rút ngắn. Điều này có thể dẫn đến tên tệp trùng lặp mà tôi cần chỉnh sửa và vì chúng sẽ được liên kết từ một trang Web, nên các tên rút gọn cần phải ổn định, nghĩa là chúng phải được tạo theo cách mà cùng một tên tệp dài sẽ luôn dẫn đến cùng tên tập tin rút ngắn. Tôi đã làm điều này bằng cách tạo ra hex md5 của tên tệp dài và nối thêm bốn ký tự đầu tiên vào tên rút gọn (tên vẫn có thể va chạm, nhưng nó rất không ổn định, vì vậy tôi chỉ kiểm tra điều kiện đó và bảo lãnh nếu điều đó xảy ra) .
Tôi đã làm điều này trong bash vì nó là một phần của hệ thống xây dựng của chúng tôi đã được viết bằng bash. Đó chính xác là khó khăn để có được đúng như bạn có thể nghĩ. Sẽ mất ít thời gian hơn để viết bằng Python và có lẽ cũng sẽ rõ ràng hơn.
Tóm lại: các ngôn ngữ khác nhau được thiết kế cho các loại nhiệm vụ khác nhau; chọn ngôn ngữ có sẵn cho bạn phù hợp nhất với nhiệm vụ sắp tới.