Lời khuyên của tôi:
bash
(và ilk của nó) không phải là ngôn ngữ lập trình mục đích chung. Mặc dù có thể thực hiện một số kịch bản phức tạp trong bash
đó không phải là cách tốt nhất để học lập trình nói chung. Đó là cách tự nhiên nhất để hoàn thành các nhiệm vụ quản trị hệ thống, chủ yếu xoay quanh việc thực thi các chương trình khác, xử lý các tệp và thư mục dữ liệu của chúng và sắp xếp đầu vào và đầu ra vào và từ chúng. Nếu bash
là một cái búa, hãy dự trữ nó cho các vấn đề thực sự trông giống như móng tay. Học cách làm bất cứ điều gì không tầm thường bash
sẽ dễ dàng hơn đáng kể nếu bạn học một số tập con rất nhỏ sed
và awk
(vì thao tác chuỗi trong bash
phần lớn được lấy cảm hứng từ cú pháp của các hoạt động tương tự trong các ngôn ngữ "nhỏ" này).
- Đối với lập trình mục đích chung trong Linux, bạn sẽ nghe thấy nhiều đối số vô tư. Hai ứng cử viên tốt nhất là Perl và Python . Đây là cả hai ngôn ngữ kịch bản cấp rất cao, là mục đích chung, cho thấy đủ chức năng cấp thấp để thực hiện hầu hết mọi hoạt động có thể truy cập được đối với bất kỳ quy trình không gian người dùng nào trên hệ thống của bạn và với các bộ sưu tập lớn các mô-đun và thư viện được viết sẵn.
Tôi khuyên bạn nên đọc một văn bản giới thiệu về C và dành chút thời gian chạy strace
và ltrace
lệnh trên một số lệnh tiện ích đơn giản như ls
và mkdir
và /bin/echo
vv (Trên thực tế những ngày này tôi muốn đề nghị ltrace -S
thay strace
nhưng đột phá vào đầu ra từ cả các lệnh và vào các ltrace
đầu ra như tăng cường bởi các -S
tùy chọn sẽ cực kỳ giáo dục).
C là ngôn ngữ lập trình chính trong đó nhân Linux và libc GNU được viết. (Các bộ phận nhỏ đang lắp ráp). Hầu như tất cả các chương trình trên hệ thống Linux (hoặc giống UNIX khác) được liên kết với các thư viện C (libc). Các trình thông dịch Perl và Python chính (và hầu hết các ngôn ngữ script khác) cũng được viết bằng C. Các chương trình này (kernel, thư viện hệ thống chung và các trình thông dịch ngôn ngữ script khác nhau) đều được các lập trình viên C viết bởi thiết kế và các tính năng của chúng bị ảnh hưởng mạnh mẽ bằng cách thực hiện cơ bản của họ. Do đó, sự hiểu biết sâu sắc hơn về bất kỳ điều nào trong số này cuối cùng cũng đòi hỏi sự hiểu biết C. Bạn không cần biết gì về C ++ cũng như Java để hiểu lập trình ở cấp độ này. (Mỗi người có thể thú vị và cần thiết theo cách riêng của họ tùy thuộc vào bản vá nghề nghiệp của bạn,
Vì vậy, nếu bạn đồng ý với cơ sở của tôi cho đến nay, chúng tôi đã đưa ra lựa chọn giữa Perl và Python.
Đây là nơi bắt đầu cuộc chiến ngọn lửa.
Lời khuyên của tôi là tập trung vào Python (2.x) trước. Python có một cú pháp tương đối đơn giản và nhất quán. Bạn có thể tìm hiểu những điều cơ bản về cú pháp Python trong vài giờ và đó là phần lớn cú pháp bạn sẽ gặp phải. Chỉ có một vài tính năng (hiểu danh sách, biểu thức trình tạo, trang trí) là các nếp nhăn theo cú pháp cơ bản. Vì vậy, hầu hết nỗ lực của bạn trong việc học Python sẽ được dành cho việc học các thư viện tiêu chuẩn rộng lớn và cố gắng tìm ra cách "tốt nhất" để sử dụng chúng (và tìm ra các trường hợp ngoại lệ cụ thể nào đáng để xử lý để làm cho chương trình của bạn mạnh mẽ) và, quan trọng nhất, trong việc học các khái niệm cơ bản.
Tôi nghĩ rằng các thư viện rộng lớn và cú pháp tương đối đơn giản của Python có hai nhược điểm riêng biệt.
Đầu tiên, khi bạn học cách làm điều gì đó ở cấp độ rất cao trong Python, bạn có thể thấy suy nghĩ phải làm việc ở cấp độ thấp hơn là tẻ nhạt. Nơi tôi làm việc Perl là tiêu chuẩn. Tôi tạo nguyên mẫu cho công việc của mình bằng Python, nơi tôi biết tôi có thể khiến nó hoạt động nhanh hơn và đáng tin cậy hơn sau đó ở Perl; sau đó tôi sợ phải đi qua và chuyển nó cho Perl cho các đồng nghiệp của tôi. (Tôi khá giỏi ở Perl năm trước khi tôi sử dụng Python --- vì vậy đó không phải là vấn đề quen thuộc đơn giản).
Nhược điểm khác là đôi khi rất khó tìm ra cách cao nhất để hoàn thành một nhiệm vụ nhất định trong Python. Ví dụ: để tìm nạp một trang web, ban đầu bạn có thể thử làm nó với các ổ cắm cấp thấp ... sẽ hoạt động. Tuy nhiên, bạn sẽ sao chép khá nhiều mã mà bạn có thể tìm thấy bao gồm trong urllib
và / hoặc urllib2
các mô-đun. Thực tế là các thư viện tiêu chuẩn, kể từ 2.7.1, bao gồm cả hai điều này làm cho quan điểm của tôi. Các nhà bảo trì Python có thể mở rộng các mô-đun và API cũ hơn một cách minh bạch; tuy nhiên, có hàng tá trường hợp Python giữ lại hai hoặc ba mô-đun trong đó không thể mở rộng trong suốt vì một số lý do. (Ví dụ khác, bạn có thể nhìn vào các tùy chọn cho phân tích tùy chọn dòng lệnh: argparse
, optparse
, vàgetopt
. Có rất ít tác hại khi viết chương trình của bạn bằng cách sử dụng getopt
(phần cũ nhất trong số này). Đối với các tiện ích rất đơn giản với một vài tùy chọn và quy ước gọi điện cứng nhắc (chỉ được sử dụng bởi một nhóm nhỏ người), thì không có gì sai khi sys.argv
tự mình đi qua . Tuy nhiên, thường đáng để đọc tài liệu một cách cẩn thận và theo các liên kết ở dưới cùng của các mô-đun cấp cũ hoặc cấp thấp hơn mô tả các tính năng cấp mới hơn hoặc cao hơn có sẵn.
Lời khuyên của tôi dựa trên ý kiến của tôi rằng bạn muốn tập trung vào các khái niệm sâu hơn và không phải dành nhiều thời gian và công sức cho các vấn đề cụ thể về cú pháp và ngôn ngữ. Hiểu khi nào nên sử dụng một quy trình con, so với một luồng hoặc các tính năng đa xử lý có trong Python có rất ít liên quan đến ngôn ngữ và mọi thứ liên quan đến trình độ thành thạo bất kể ngôn ngữ. (Tại thời điểm mà bạn có thể hiểu các đối số về mô hình hướng sự kiện của Twisted bằng cách so sánh với luồng và đa xử lý thì có lẽ bạn sẽ thành thạo Python và sẵn sàng lập trình bằng bất kỳ ngôn ngữ nào).
Đối số truy cập, đối với Perl, là đơn giản và thực tế. Có khá nhiều công việc ngoài kia sẽ gọi, đặc biệt, cho các kỹ năng với Perl. Perl là một ngôn ngữ mạnh mẽ và có thư viện cực kỳ rộng lớn. (Cốt lõi của Perl được phân phối với hầu hết hệ thống Linux có phạm vi chức năng nhỏ hơn so với các thư viện Python tiêu chuẩn; giả định rằng bạn sẽ cài đặt một số lượng đáng kể các gói bổ sung từ bản phân phối của mình hoặc thông qua CPAN --- Lưu trữ Perl toàn diện Mạng). (Ngược lại, có ít mô-đun và gói Python hơn mà tôi phải tìm nạp riêng ... chúng có sẵn từ PyPI --- Chỉ mục gói Python).
Vì vậy, nếu bạn học Perl, bạn sẽ nhanh chóng tìm được việc làm, đặc biệt là các công việc sysadmin, trong thời gian ngắn. Tuy nhiên, cú pháp của Perl là ... à ... theo cách nói của một số người đam mê nó ... "chiết trung bệnh lý!" Perl có thể cực kỳ ngắn gọn và mã của nó chứa đầy dấu chấm câu. Những người yêu thích nó sẽ tranh luận không ngừng rằng nó "dễ dàng" và có ý nghĩa hoàn hảo --- và sẽ có cơ hội vô tận để làm điều đó trong các diễn đàn chứa đầy sự nhầm lẫn về cách chính xác một đoạn mã được giải thích. Cú pháp và ngôn ngữ được sử dụng trong tài liệu và bởi những người hỗ trợ nó trong các diễn đàn công cộng có sắc thái đến mức bạn có thể dành nỗ lực đáng kể để tìm hiểu chúng.
Bây giờ, xin vui lòng nhận ra rằng bình luận trước đó là chủ quan và thiên vị. Có thể bạn sẽ thử Perl và thấy cú pháp của nó trực quan và dễ chịu. Nếu vậy, thêm sức mạnh cho bạn. Tuy nhiên, cá nhân tôi thấy rằng sự nắm bắt các đặc điểm riêng của Perl bị phân rã rất nhanh. Các nguyên tắc cơ bản tôi giữ lại nhưng tôi thấy nó là một cuộc đấu tranh bất cứ khi nào tôi phải chuyển trở lại nó trong hơn một vài dòng mã.
Có rất nhiều ngôn ngữ khác mà bạn sẽ học, Java, Lisp và Scheme, TCL, Scala, v.v. Tuy nhiên, tôi khuyên bạn nên bắt đầu với một thứ mang lại sự cân bằng tốt nhất giữa tiện ích và sự đơn giản.