บทนำ
ผมถือว่าตัวเองเป็นผู้ใช้ Bash ที่มีความสุข อย่างไรก็ตาม เมื่อผมเริ่มสำรวจ Unix มันบน proprietary Unix system ที่ให้ tcsh เป็นค่าเริ่มต้น ดังนั้นประสบการณ์ shell แรกๆ ของผมอยู่บน modern version ของ C shell (csh) นั้นกลับกลายเป็นอุบัติเหตุที่โชคดี เพราะ tcsh ยังเป็น shell ที่เลือกใช้ที่ film studio ที่ผมทำงานต่อมาในอาชีพ
จนถึงวันนี้ มีหลายงานที่ผมเชื่อมโยงกับ tcsh แม้จะไม่มี logical correlation ที่นั่น ผมยังใช้ tcsh บนระบบอย่างน้อยหนึ่งระบบ หากเพื่อฝึกฝนอย่างเดียว ผมยังติดตั้งมันไว้บนระบบทั้งหมดของผม เพื่อรักษาความเข้ากันได้กับ tcsh scripts ของตัวเอง และให้แน่ใจว่าผมสามารถ launch มันได้เมื่อผมต้องการเขียนสคริปต์ที่ผมชอบให้เป็น tcsh
ความแตกต่างระหว่าง C shell และ Bash
Tcsh เป็น modern continuation ของ csh เมื่อ C shell เปิดตัวครั้งแรกในปี 1978 ผู้ใช้ตื่นเต้นกับ C-like syntax ของมัน C เป็นภาษาโปรแกรมใหม่ในขณะนั้น และสำคัญกว่า มันคือสิ่งที่ Unix เขียนด้วย ดังนั้นผู้ใช้ Unix ส่วนใหญ่สบายใจกับ C มากกว่าภาษาสคริปติ้ง subjective ตัวอย่าง ใน Bash คำสั่ง if loop นี้ทำ "secret" call ไปที่ binary test เพื่อประเมิน conditional statement (ส่วนในวงเล็บ):
v=1 if [ $v -gt 0 ] then echo "verbose" fi
นี่คือคำสั่งเดียวกันใน csh หรือ tcsh โดยไม่มี external call ไป test เพราะ conditional statement (โค้ดในวงเล็บ) ใช้ built-in evaluation ของ csh:
set v=1 if ($v > 1) then echo "verbose" endif
สิ่งนี้สาธิตหลายอย่าง ทั้งดีและแย่ ตัวอย่าง การพิมพ์ conditional ในวงเล็บเป็นธรรมชาติสำหรับ C programmer และเป็นประโยชน์จากมุมมองโปรแกรมเมอร์ที่มี math evaluation built-in ใน executable ตรงข้าม ไวยากรณ์ if loop มีความเหมือน Lua มากกว่า C ซึ่งใช้ braces เป็น delimiters:
// this does not work in Csh
if ( v>1 ) {
printf("verbose");
}
ในทางหนึ่ง นี่สรุป csh ได้ดี: มัน clean, efficient, และ familiar สำหรับบางคน แต่ quirky และ inconsistent
ทำไมจึงใช้มัน?
Tcsh สำหรับความแม่นยำ
ผมเขียน C++ และ Java มากกว่า C code ดังนั้นความสนใจของผมใน tcsh แบ่งปันน้อยกับ claim to fame ทางประวัติศาสตร์ของมัน อย่างไรก็ตาม ผมเพลิดเพลินกับ Lua และในทางหนึ่ง ผมคิดว่าตัวเองคิดถึง tcsh และ shells อื่นๆ เหมือนกับ Lua และ Python หรือแม้แต่ Markdown และ Docbook ทั้งสอง shells มี merit และง่ายที่จะชี้ไปที่ตัวที่ popular กว่า แต่มี strict clarity อยู่ที่อีกตัว ผมรู้สึกว่า tcsh มี precision ที่หลาย shells อื่นๆ ขาด
Variables
คุณไม่ได้ luxury ของ typed variables ใน shells แตด้วย tcsh คุณอย่างน้อยก็ declare พวกมันด้วย keyword แปลกๆ คือมีหลาย keywords สำหรับงานนี้ แตตัวที่ผมเลือกคือ set:
> set var=foo > echo $var foo
คุณสามารถ expand variables โดยพิมพ์ชื่อ variable (var ในตัวอย่าง) แล้วกด Ctrl+X ตามด้วย $ (dollar) key ตัวอย่างข้างต้นตั้ง var เป็น foo
เหมือนหลาย shells อื่นๆ คุณสามารถ list ทุก set variables ด้วย set เพียงอย่างเดียวโดยไม่มี arguments:
> set term xterm tty pts/2 uid 1000 user seth var foo [...]
คุณสามารถ unset variable ด้วยคำสั่ง unset:
> unset var > set | grep var >
การขาดฟีเจอร์คือฟีเจอร์
คุณอาจเคยเห็นบรรทัดแบบนี้ในสคริปต์:
var=GitLab
${var,,}
บรรทัดที่สองเป็น built-in function เพื่อ transform เนื้อหาของ var เป็น lowercase
ในขณะที่ extra functions เหล่านี้มีประโยชน์มาก ผมบางครั้งรู้สึกว่าพวกมันเป็น invitation ให้ obfuscation Shell scripting เหมือน HTML ของการเขียนโปรแกรม มันเป็นหนึ่งในภาษา serious เล่นๆ ที่คุณสอนตัวเองได้แค่จากการอ่านโค้ดของคนอื่น นั่นไม่ใช่เหตุผลที่ดีที่จะยอมให้ฟังก์ชันที่มีประโยชน์ไป แต่เป็นเหตุผลที่ผมพยายามหลีกเลี่ยง shorthand ที่ cryptic ยอดนิยมในภาษาต่างๆ เมื่อเขียนใน tcsh ผมไม่มีตัวเลือกใช้ shorthand มากนัก ดังนั้น complex string operations ต้องทำด้วย basic Unix tools แทนที่จะเป็น built-in shortcuts ผมเชื่อว่ามันทำให้โค้ดอ่านง่ายขึ้น และทำความแตกต่างมากต่อ future contributors — และ future, forgetful me
Built-in math
หนึ่งในสิ่งที่ผมชอบ tcsh คือ built-in @ math shortcut เหมือนหลาย self-taught Unix users ผมพบ bc แบบสุ่ม และนับถือมันมาตลอด ผ่าน no fault ของตัวมันเอง bc บ่อยครั้งสอนให้ผู้ใช้เป็น command-line calculator เมื่อมันจริงๆ แล้วเหมาะสมกว่าเป็น calculation language Workarounds รวมถึง amazing 300-line calculator ใน pure Bash หรือคำสั่ง let ใน Bash หรือคำสั่ง @ ใน tcsh
> @ n = ( 1 + 1 / 2 ) > echo $n 1
สำหรับ math ที่ซับซ้อนมาก อาจคุ้มค่าที่จะเรียน bc หรือ Python mathematics library ที่ดี
All the essentials (ทุกอย่างที่จำเป็น)
สำหรับผม tcsh ทำ balance ที่สมบูรณ์แบบระหว่าง stark simplicity และ essential features มันไม่ใช่ shell สำหรับทุกผู้ใช้ หรือแม้แต่ทุกวัตถุประสงค์ แต่หากคุณมองหาวิธีลดความซับซ้อนของมุมมองโลกข้อความของคุณ tcsh อาจให้ alternative ที่น่าสนใจ