Unix, Linux: Bourne shell, C shell, Bourne shell and Bash Shell

Bourne shell เป็น default shell ของ Unix version 7 ขึ้นไป พัฒนาขึ้นในปี 1977 (ก่อนหน้านั้นเป็น Thompson shell ซึ่งเป็น shell ตัวแรก) ชื่อ Bourne ได้ชื่อตามชื่อคนสร้าง Stephen Bourne โดย AT&T Bell Lab

ส่วน C shell (csh) พัฒนามาจาก Thompson shell ที่ได้จาก Unix version 6 ก่อนที่จะเริ่มใช้ Bourne shell ซึ่ง syntax จะคล้ายกับ C แต่เดี๋ยวนี้เค้าไม่ค่อยนิยมใช้กันแล้ว เนื่องจากมีการพัฒนาเป็น Tenex C shell (tcsh) และ Korn shell ก็ได้มีการเลียนแบบ function ต่างๆ ของ C shell ไปพัฒนา

Korn shell (ksh) พัฒนาขึ้นในปี 1980 โดย David Korn จาก AT&T Bell Lab เช่นเดียวกับ Bourne จึงไม่น่าแปลกใจที่ Korn shell จะเป็น backward compatible กับ Borne shell และได้นำ function ต่างๆ ที่มีอยู่ใน C shell ใส่เข้าไปใน Korn shell ตอนแรกตัว Korn shell ยังเป็น software ที่มี license เหมือนกับ software ทั่วไปอยู่ จนกระทั่ง release 93q (ksh93) จึงได้กลายเป็น open source software เต็มตัว และตอนหลังก็ได้ มีการนำมาไว้ใน Linux ด้วย (ลองไปดูกันได้ที่ /bin/ksh) และต่อมาก็ยังมีลูกหลายอีกหลายตัวด้วยกัน เช่น pdksh, mksh, dtksh, tksh ซึ่งสองตัวหลังมีการพัฒนาเป็น GUI ด้วย

Bash shell ย่อมาจาก Bourne-Again Shell เป็น free software shell ซึ่งเกิดมาจาก GNU project สร้างขึ้นเพื่อเลียนแบบ Bourne shell บน Unix ในปี 1987 ดังนั้น Bash shell จึงเป็น default shell ของ OS ทุกตัวที่มาจาก GNU OS เช่น Linux, Mac OS X รวมถึงที่เราใช้ POSIX บน Cygwin ด้วย ข้อสังเกตุนะค่ะ คือ Bash shell เค้าไม่ได้พัฒนามาให้ใช้บน Unix ซึ่งบน Unix ตัว Bourne shell ได้พัฒนาไปเป็น Korn shell ส่วนตัว Bash shell จะใช้แค่บน Linux เป็นหลักเท่านั้น

โดยทุกคำสั่งใน Bourne สามารถใช้ได้บน Bash แต่ว่าไม่สามารถทำในทางกลับกันได้ (คือเสมือนว่า Bash พัฒนา่ต่อจาก Bourne อีกที ดังนั้นก็จะมี function เพิ่มขึ้นมาจากของเดิม) ดังนั้น shell script ของ Bourne จะสามารถใช้ได้บน Bash shell (ยกเว้นว่าใน script มีการใช้ตัวแปรพิเศษที่มีใน Bourne shell เท่านั้น) สำหรับ bash shell script จะขึ้นต้นด้วย # !/bin/sh และยังมีการนำแนวความคิดบางอย่างของ Korn shell และ C shell มาใช้ด้วย เช่น command line editing, command history (เช่นสามารถใช้คำสั่ง history เพื่อดูคำสั่งย้อนหลัง หรือใช้คำสั่ง !! เพื่อ run คำสั่งล่าสุดได้) นอกจากนั้นยังมีความสามารถในการ automatic command line completion (คือการใช้คีย์ tab เพื่อให้ shell เติมชื่อไฟล์ให้ครบถ้วน) และอื่นๆ อีก เช่นการคำนวณ integer ซึ่งเค้่าว่าใน bash shell จะไม่ต้องแตก process เพื่อใช้คำนวณ

Default prompt ของ C shell จะเป็น % ในขณะที่ Bourne shell, Korn shell, Bash shell เป็น $ (ก็ไม่น่าแปลกใจนะค่ะ เพราะว่า ตัว Korn shell กับ Bash shell ได้พัฒนาขึ้นมาจาก Bourne อีกที)

และสำหรับการ redirect standard output และ standard error ก็ต่างกันดังนี้
คำสั่งC shellBourne shell
Redirect standard output>>
Redirect standard errorไม่มีคำสั่งนี้2>
Redirect standard output and standard error>&ไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้ เช่น ls >test 2>test จะ redirect ไปที่ไฟล์ test เหมือนกัน
Redirect standard error to standard outputไม่มี แต่สามารถใช้ >& แทน เพื่อ redirect ไปที่เดียวกันได้2>&1 (ตอนใช้ต้องใช้ติดกันแบบนี้เลยค่ะ ม่ะงั้นมันจะเพี้ยน)
Redirect standard input<<
Redirect standard output; overwrite file if it exists>! หรือ > ให้ผลเหมือนกัน>
Redirect standard output and standard error; overwrite file if it exists>&! หรือ >& ให้ผลเหมือนกันเช่นเดียวกับข้างต้นไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้
Redirect standard output to another command (pipe)||
Append standard output>>>>
Append standard output and standard error>>&เช่นเดียวกับข้างต้นไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้ เช่น ls >>test 2>>test
Pipe standard output and standard error to another commandไม่มี2>&1|


สำหรับ Korn shell และ Bash shell น่าจะเหมือนกับ Bourne shell นะค่ะ ยังไม่มีโอกาสได้ลอง ไว้ถ้าได้ลองแล้วจะมาใส่ไว้ให้ค่ะ

Reference:
Wikipedia - Bourne shell
Wikipedia - C shell
Wikipedia - Korn shell
Unix Sys Admin
Standard Input and Output Redirection

No comments:

Post a Comment