Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Tại sao tôi vẫn yêu tcsh sau ngần ấy năm

Tôi coi mình là một người dùng Bash hạnh phúc. Tuy nhiên, khi tôi bắt đầu khám phá Unix, nó nằm trên một hệ thống Unix độc quyền cung cấp tcsh theo mặc định, vì vậy trải nghiệm shell đầu tiên của tôi là trên phiên bản hiện đại của C shell (csh). Điều đó hóa ra chỉ là một tai nạn may mắn vì tcsh cũng là vỏ bọc được lựa chọn tại xưởng phim nơi tôi làm việc sau này trong sự nghiệp của mình.

Cho đến ngày nay, có một số nhiệm vụ tôi liên kết với tcsh, mặc dù không có mối tương quan logic nào ở đó. Tôi vẫn sử dụng tcsh trên ít nhất một hệ thống, nếu chỉ để duy trì trong thực tế. Tôi cũng cài đặt nó trên tất cả các hệ thống của mình để duy trì khả năng tương thích với các tập lệnh tcsh của riêng mình và để đảm bảo tôi có thể khởi chạy nó khi cần viết tập lệnh mà tôi muốn có trong tcsh.

Sự khác biệt giữa C shell và Bash

Tcsh là sự tiếp nối hiện đại của csh. Khi trình bao C được phát hành vào năm 1978, người dùng đã rất hào hứng với cú pháp giống C của nó. C là một ngôn ngữ lập trình mới vào thời điểm đó, và quan trọng hơn, nó là thứ được viết bằng Unix, vì vậy hầu hết người dùng Unix cảm thấy thoải mái hơn với C hơn là một ngôn ngữ kịch bản tùy ý. Ví dụ, trong Bash, if này loop thực hiện cuộc gọi "bí mật" tới test nhị phân để đánh giá câu lệnh điều kiện (phần trong ngoặc):

v=1

if [ $v -gt 0 ]
  then
  echo "verbose"
fi

Đây là câu lệnh tương tự trong csh hoặc tcsh, không có lệnh gọi bên ngoài để test bởi vì câu lệnh điều kiện (mã trong ngoặc đơn) sử dụng đánh giá tích hợp sẵn của csh:

set v=1

if ($v > 1) then
  echo "verbose"
endif

Điều này chứng tỏ một vài điều, cả tốt và xấu. Ví dụ, một lập trình viên C nhập một điều kiện trong ngoặc là điều tự nhiên, và từ quan điểm của lập trình viên, việc đánh giá toán học được tích hợp vào tệp thực thi là điều hoàn toàn tự nhiên. Mặt khác, if Cú pháp vòng lặp có nhiều điểm chung với Lua hơn C, sử dụng dấu ngoặc nhọn làm dấu phân cách:

// this does not work in Csh
if ( v>1 ) {
        printf("verbose");
}

Theo một cách nào đó, điều này tóm lại một cách độc đáo:nó sạch sẽ, hiệu quả và quen thuộc với một số người, nhưng kỳ quặc và không nhất quán.

Vậy tại sao lại sử dụng nó?

Tcsh cho độ chính xác

Tôi viết nhiều C ++ và Java hơn mã C, vì vậy mối quan tâm của tôi đối với tcsh ít chia sẻ với tuyên bố nổi tiếng lịch sử của nó. Tuy nhiên, tôi thích Lua và theo một cách nào đó, tôi nghĩ về tcsh và các shell khác giống như tôi nghĩ về Lua và Python hoặc thậm chí là Markdown và Docbook. Cả hai lớp vỏ đều có giá trị và thật dễ dàng để chỉ ra cái phổ biến hơn, nhưng có sự rõ ràng nghiêm ngặt đối với cái còn lại. Trên thực tế, tôi cảm thấy tcsh có độ chính xác mà nhiều shell khác thiếu.

Biến

Bạn không nhận được sự sang trọng của các biến đã nhập trong shell, nhưng với tcsh, ít nhất bạn có thể khai báo chúng bằng một từ khóa. Thật kỳ lạ, có một số từ khóa bạn có thể sử dụng cho nhiệm vụ, nhưng từ khóa mà tôi đã giải quyết là set :

> set var=foo
> echo $var
foo

Bạn có thể mở rộng các biến bằng cách nhập tên của biến (var trong ví dụ này) và sau đó nhấn Ctrl + X theo sau là $ phím (đô la). Ví dụ trên đặt var tới foo .

Như với nhiều trình bao khác, bạn có thể liệt kê tất cả các biến tập hợp bằng cách sử dụng set một mình không có đối số:

> set
term    xterm
tty     pts/2
uid     1000
user    seth
var     foo
[...]

Bạn có thể hủy đặt một biến bằng cách sử dụng unset lệnh:

> unset var
> set | grep var
>

Thiếu tính năng là một tính năng

Có thể bạn đã thấy những dòng như thế này trong một script:

var=GitLab
${var,,}

Dòng thứ hai là một hàm tích hợp để chuyển đổi nội dung của var thành chữ thường.

Trong khi các chức năng bổ sung như thế này vô cùng hữu ích, đôi khi tôi cảm thấy chúng là một lời mời để làm xáo trộn. Shell scripting giống như HTML của lập trình; đó là một trong số ít ngôn ngữ nghiêm túc mà bạn có thể tự học chỉ bằng cách đọc mã của người khác. Đó không hẳn là một lý do tuyệt vời để từ bỏ các chức năng hữu ích, nhưng đó là lý do tôi cố gắng tránh một số cách viết tắt khó hiểu phổ biến trong các ngôn ngữ khác nhau. Khi viết bằng tcsh, tôi không có tùy chọn sử dụng nhiều tốc ký, vì vậy các hoạt động chuỗi phức tạp phải được thực hiện bằng các công cụ Unix cơ bản hơn là bằng các phím tắt tích hợp sẵn. Tôi tin rằng nó dẫn đến mã dễ đọc hơn và điều đó tạo ra sự khác biệt lớn đối với những người đóng góp trong tương lai — và đối với tôi hay quên trong tương lai .

Tích hợp toán học

Một trong những điều tôi thích ở tcsh là tích hợp sẵn @ phím tắt toán học. Giống như hầu hết những người dùng Unix tự học, tôi tình cờ gặp bc, và tôi đã hối hận kể từ đó. Không có lỗi của riêng nó, bc thường được dạy cho người dùng như một máy tính dòng lệnh khi nó thực sự phù hợp hơn như một ngôn ngữ tính toán . Các giải pháp thay thế bao gồm một máy tính 300 dòng tuyệt vời bằng Bash thuần túy hoặc let lệnh trong Bash hoặc @ lệnh trong tcsh.

> @ n = ( 1 + 1 / 2 )
> echo $n
1

Đối với toán học rất phức tạp, có thể đáng để học bc hoặc một thư viện toán học Python tốt.

Tất cả các yếu tố cần thiết

Đối với tôi, tcsh đạt được sự cân bằng hoàn hảo giữa tính đơn giản và các tính năng thiết yếu. Nó không phải là một trình bao cho tất cả người dùng hoặc thậm chí cho tất cả các mục đích, nhưng nếu bạn đang muốn đơn giản hóa quan điểm về thế giới dựa trên văn bản của mình, tcsh có thể cung cấp một giải pháp thay thế thú vị.