Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

ทำไมฉันยังคงรัก tcsh หลังจากหลายปีที่ผ่านมา

ฉันคิดว่าตัวเองเป็นผู้ใช้ Bash ที่มีความสุข อย่างไรก็ตาม เมื่อฉันเริ่มสำรวจ Unix มันอยู่บนระบบ Unix ที่เป็นกรรมสิทธิ์ซึ่งให้ tcsh เป็นค่าเริ่มต้น ดังนั้นประสบการณ์เชลล์แรกสุดของฉันจึงอยู่บน C shell เวอร์ชันใหม่ (csh) นั่นกลายเป็นอุบัติเหตุที่โชคดีเพราะ tcsh เป็นตัวเลือกที่ดีสำหรับสตูดิโอภาพยนตร์ที่ฉันทำงานในภายหลังในอาชีพการงานของฉัน

จนถึงวันนี้ มีงานหลายอย่างที่ฉันเชื่อมโยงกับ tcsh แม้ว่าจะไม่มีความสัมพันธ์เชิงตรรกะที่นั่นก็ตาม ฉันยังคงใช้ tcsh กับระบบอย่างน้อยหนึ่งระบบ ถ้าเพียงเพื่อฝึกฝน ฉันยังติดตั้งไว้บนระบบทั้งหมดของฉันเพื่อรักษาความเข้ากันได้กับสคริปต์ tcsh ของฉันเอง และเพื่อให้แน่ใจว่าฉันสามารถเปิดใช้งานได้เมื่อฉันต้องการเขียนสคริปต์ที่ฉันต้องการให้มีใน tcsh

ความแตกต่างระหว่าง C เชลล์และ Bash

Tcsh คือความต่อเนื่องที่ทันสมัยของ csh เมื่อ C เชลล์เปิดตัวในปี 1978 ผู้ใช้ต่างตื่นเต้นกับรูปแบบ C-like C เป็นภาษาการเขียนโปรแกรมใหม่ในขณะนั้น และที่สำคัญกว่านั้นคือเป็นภาษาที่ Unix เขียน ดังนั้นผู้ใช้ Unix ส่วนใหญ่จึงคุ้นเคยกับ C มากกว่าภาษาสคริปต์ที่กำหนดเอง ตัวอย่างเช่นใน Bash if . นี้ loop ทำการเรียก "ความลับ" ไปที่ test ไบนารีเพื่อประเมินคำสั่งเงื่อนไข (ส่วนในวงเล็บ):

v=1

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

นี่คือคำสั่งเดียวกันใน csh หรือ tcsh โดยไม่มีการเรียกภายนอกไปยัง test เนื่องจากคำสั่งแบบมีเงื่อนไข (โค้ดในวงเล็บ) ใช้การประเมินในตัวของ csh:

set v=1

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

สิ่งนี้แสดงให้เห็นบางสิ่งทั้งดีและไม่ดี ตัวอย่างเช่น เป็นเรื่องปกติที่โปรแกรมเมอร์ C จะพิมพ์เงื่อนไขในวงเล็บ และจากมุมมองของโปรแกรมเมอร์ควรมีการประเมินทางคณิตศาสตร์ในไฟล์สั่งการ ในทางกลับกัน if ไวยากรณ์ลูปมีความเหมือนกันกับ Lua มากกว่า C ซึ่งใช้วงเล็บปีกกาเป็นตัวคั่น:

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

ในแง่หนึ่ง สิ่งนี้สรุป csh ได้ชัดเจน:มันสะอาด มีประสิทธิภาพ และคุ้นเคยสำหรับบางคน แต่แปลกและไม่สอดคล้องกัน

ทำไมต้องใช้มัน?

Tcsh เพื่อความแม่นยำ

ฉันเขียน C ++ และ Java มากกว่ารหัส C ดังนั้นความสนใจของฉันใน tcsh จึงมีเพียงเล็กน้อยโดยอ้างว่ามีชื่อเสียงในอดีต อย่างไรก็ตาม ฉันชอบ Lua และในทางหนึ่ง ฉันนึกถึง tcsh และเชลล์อื่นๆ เช่น ฉันนึกถึง Lua และ Python หรือแม้แต่ Markdown และ Docbook กระสุนทั้งสองมีข้อดี และง่ายต่อการชี้ไปที่อันที่ได้รับความนิยมมากกว่า แต่อีกอันมีความชัดเจนที่เข้มงวด อันที่จริง ฉันรู้สึกว่า tcsh มีความแม่นยำที่กระสุนอื่น ๆ ขาดหายไป

ตัวแปร

คุณไม่ได้รับความหรูหราของตัวแปรที่พิมพ์ในเชลล์ แต่ด้วย tcsh คุณสามารถประกาศได้ด้วยคีย์เวิร์ดเป็นอย่างน้อย น่าแปลกที่มีคีย์เวิร์ดหลายคำที่คุณสามารถใช้กับงานนี้ได้ แต่คีย์เวิร์ดที่ฉันใช้คือ set :

> set var=foo
> echo $var
foo

คุณสามารถขยายตัวแปรได้โดยพิมพ์ชื่อของตัวแปร (var ในตัวอย่างนี้) แล้วกด Ctrl+X ตามด้วย $ (ดอลลาร์) คีย์ ตัวอย่างด้านบนตั้งค่า var ถึง foo .

เช่นเดียวกับเชลล์อื่นๆ คุณสามารถแสดงรายการตัวแปรชุดทั้งหมดได้โดยใช้ set คนเดียวโดยไม่มีข้อโต้แย้ง:

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

คุณสามารถยกเลิกการตั้งค่าตัวแปรโดยใช้ unset คำสั่ง:

> unset var
> set | grep var
>

คุณลักษณะที่ขาดหายไปคือคุณลักษณะ

บางทีคุณอาจเคยเห็นบรรทัดแบบนี้ในสคริปต์:

var=GitLab
${var,,}

บรรทัดที่สองเป็นฟังก์ชันในตัวเพื่อแปลงเนื้อหาของ var เป็นตัวพิมพ์เล็ก

แม้ว่าฟังก์ชันพิเศษเช่นนี้จะมีประโยชน์อย่างไม่รู้จบ แต่บางครั้งฉันก็รู้สึกว่าเป็นการเชิญชวนให้เกิดความสับสน การเขียนสคริปต์เชลล์เป็นเหมือน HTML ของการเขียนโปรแกรม เป็นหนึ่งในภาษาจริงจังไม่กี่ภาษาที่คุณสามารถสอนตัวเองได้เพียงแค่อ่านโค้ดของคนอื่น นั่นไม่ใช่เหตุผลที่ดีเสมอไปที่จะเลิกใช้ฟังก์ชันที่มีประโยชน์ แต่นั่นเป็นเหตุผลที่ฉันพยายามหลีกเลี่ยงคำย่อที่คลุมเครือซึ่งเป็นที่นิยมในภาษาต่างๆ เมื่อเขียนด้วย tcsh ฉันไม่มีตัวเลือกให้ใช้ชวเลขมาก ดังนั้นการดำเนินการสตริงที่ซับซ้อนจะต้องดำเนินการด้วยเครื่องมือ Unix พื้นฐาน แทนที่จะใช้ทางลัดในตัว ฉันเชื่อว่าผลลัพธ์ที่ได้คือโค้ดที่อ่านง่ายกว่า และสร้างความแตกต่างอย่างมากให้กับผู้ร่วมเขียนข้อความในอนาคต และต่อในอนาคตที่หลงลืมฉัน .

คณิตศาสตร์ในตัว

สิ่งหนึ่งที่ฉันชอบเกี่ยวกับ tcsh คือ @ . ในตัว ทางลัดคณิตศาสตร์ เช่นเดียวกับผู้ใช้ Unix ที่เรียนรู้ด้วยตนเองส่วนใหญ่ ฉันสะดุดกับ bc และรู้สึกเสียใจตั้งแต่นั้นมา bc มักถูกสอนให้ผู้ใช้เป็นเครื่องคำนวณบรรทัดคำสั่งโดยปราศจากข้อผิดพลาด bc มักจะถูกสอนให้เหมาะกับการคำนวณ ภาษา . วิธีแก้ปัญหารวมถึงเครื่องคิดเลข 300 บรรทัดที่น่าทึ่งใน Pure Bash หรือ ปล่อยให้ คำสั่งใน Bash หรือ @ คำสั่งใน tcsh

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

สำหรับคณิตศาสตร์ที่ซับซ้อนมาก อาจคุ้มค่าที่จะเรียนรู้ bc หรือห้องสมุดคณิตศาสตร์ Python ที่ดี

สิ่งจำเป็นทั้งหมด

สำหรับฉัน tcsh สร้างสมดุลที่สมบูรณ์แบบระหว่างความเรียบง่ายโดยสิ้นเชิงและคุณสมบัติที่จำเป็น ไม่ใช่เชลล์สำหรับผู้ใช้ทั้งหมด หรือแม้แต่เพื่อวัตถุประสงค์ทั้งหมด แต่ถ้าคุณต้องการทำให้มุมมองของคุณเกี่ยวกับโลกแบบข้อความของคุณง่ายขึ้น tcsh อาจเป็นทางเลือกที่น่าสนใจ