แบช
แบช () เป็นเชลล์ยูนิกซ์ที่พัฒนาขึ้นสำหรับโครงการกนู ชื่อเต็มของโปรแกรมล้อเลียนเชลล์อีกตัวคือ บอร์นเชลล์ (Bourne shell) แบชเขียนมาใช้แทนบอร์นเชลล์ซึ่งเขียนขึ้นสำหรับยูนิกซ์เวอร์ชัน 7 โดย สตีเฟน บอร์น (Stephen Bourne) เมื่อประมาณ ค.ศ. 1978 ไบรอัน ฟอกซ์ (Brian Fox) เขียนแบชไว้เมื่อ ค.ศ. 1987 ตั้งแต่ ค.ศ. 1990 เป็นต้นมาผู้ดูแลพัฒนาหลักคือ เช็ต เรมี (Chet Ramey)
ในลีนุกซ์ส่วนใหญ่และในแมคโอเอสเท็นใช้แบชเป็นเชลล์มาตรฐาน แบชสามารถทำงานบนระบบปฏิบัติการยูนิกซ์และใกล้เคียง ยังปรับปรุงให้สามารถทำงานในไมโครซอฟท์วินโดวส์โดยโครงการ Cygwin และในดอสโดยโครงการ DJGPP ด้วย
รูปแบบคำสั่งของแบชครอบคลุมคำสั่งทั้งหมดของบอร์นเชลล์ ดังนั้นสคริปต์ที่เขียนสำหรับบอร์นเชลล์ส่วนใหญ่จึงสามารถรันใน bash ได้โดยไม่ต้องแก้ไข จะมียกเว้นก็เช่น สคริปต์ที่เรียกใช้ตัวแปรพิเศษในบอร์นเชลล์ หรือใช้คำสั่งภายในของบอร์นเชลล์
รูปแบบคำสั่งในแบชยังได้รับแนวความคิดจาก คอร์นเชลล์ (ksh) และ ซีเชลล์ (csh) เช่น การแก้ไขคำสั่ง จำคำสั่งเก่า ตัวแปร $RANDOM และ $PPID เป็นต้น เวลาใช้เป็นเชลล์ทางบรรทัดคำสั่ง แบชจะเติมชื่อโปรแกรม ชื่อไฟล์ ชื่อตัวแปร ให้ครบโดยอัตโนมัต เมื่อผู้ใช้กดปุ่ม TAB
ต่อไปนี้เป็นตัวอย่างรูปแบบคำสั่งที่เพิ่มเติมมาในแบชซึ่งบอร์นเชลล์ไม่มี
แบชสามารถคำนวณตัวเลขจำนวนเต็มโดยไม่ต้องเรียกใช้โปรแกรมอื่น ในการคำนวณจะใช้คำสั่ง ((...)) หรือ $[...]
คำสั่ง ((...)) ยังใช้ในการตรวจสอบเงื่อนไข ว่าเป็นจริงหรือเท็จ เช่น
สามารถใช้เงื่อนไข '==', '!=', '>', '=' และ '<=' ในคำสั่ง ((...))
แบชไม่สามารถคำนวณค่าเป็นจำนวนทศนิยมได้ มีเพียง คอร์นเชลล์ และ Z เชลล์ เท่านั้นที่ทำได้
แบชมีรูปแบบคำสั่งหลายอย่างในการเปลี่ยนทิศทาง I/O ตัวอย่างเช่น ถ้าต้องการเปลี่ยน standard output (stdout) และ standard error (stderr) ไปเก็บในไฟล์ สามารถใช้รูปแบบ
ซึ่งง่ายกว่าบอร์นเชลล์ที่ต้องพิมพ์ "command > file 2>&1"
ตั้งแต่รุ่น 2.05b เป็นต้นมา แบชสามารถดึงข้อความสตริงไปเข้า standard input (เรียกว่า "here documents" หรือ "heredocs") ได้ดังนี้
ถ้าในสตริงมีตัวอักษรช่องว่าง หรือตัวอักษรพิเศษอื่น ๆ ต้องใส่สตริงในเครื่องหมายคำพูด
ตัวอย่าง:
Redirect standard output to a file, write data, close file, reset stdout
เปิดและปิดไฟล์
เก็บผลลัพธ์ของคำสั่งภายนอก
แบช 3.0 สนับสนุนการตรวจสอบนิพจน์ปรกติในตัวแบชเองโดยใช้รูปแบบคำสั่งที่คล้ายกับภาษาเพิร์ลดังนี้
รูปแบบของนิพจน์ปรกติจะเหมือนกับที่กำหนดในหน้าแมนเพจ regex(7) ผลลัพธ์ที่ได้จะเป็น 0 ถ้าสายอักขระตรงกัน และเป็น 1 ถ้าไม่ตรงกัน ข้อความในวงเล็บภายในนิพจน์ปรกติสามารถอ่านได้จากตัวแปร BASH_REMATCH ดังต่อไปนี้
รูปแบบคำสั่งนี้ ทำงานมีประสิทธิภาพกว่าการรันโปรแกรม grep ต่างหาก ถ้าในนิพจน์ปรกติหรือสายอักขระมีตัวอักษรว่าง หรือตัวอักษรพิเศษ (เช่น '*' หรือ '?') ต้องใส่ในเครื่องหมายคำพูด
ข้อความในรูป $'string' จะถูกจัดการเป็นพิเศษ ข้อความดังกล่าวจะถูกแปลงเป็นstring โดยที่ตัวอักษรที่ขึ้นต้นด้วยแบ็กสแลช (\) จะถูกแปลงตามที่กำหนดไว้ในภาษาซี ดังตารางต่อไปนี้
หลังจากแปลงแล้วข้อความจะอยู่ภายในเครื่องหมายคำพูด '...' เหมือนกับว่าไม่มีตัวอักษร $ อยู่
ข้อความตัวอักษรที่อยู่ภายใน $"..." จะถูกแปลตามโลเคล (locale) ปัจจุบัน ถ้าโลเคลปัจจุบันคือ C หรือ POSIX เครื่องหมายดอลลาร์จะไม่มีผล แต่ถ้าสตริงถูกแปลและแทนที่ ผลลัพธ์จะอยู่ในเครื่องหมายคำพูด "..."
เมื่อแบชเริ่มทำงาน มันจะทำคำสั่งในสคริปเริ่มต้นต่าง ๆ กันแล้วแต่กรณี
ถ้าเรียกแบชเป็นเชลล์ล็อกอิน หรือเรียกโดยมีออปชัน --login มันจะไปค้นหา /etc/profile ตามด้วย ~/.bash_profile, ~/bash_login และ ~/.profile ตามลำดับ มันจะรันคำสั่งในไฟล์แรกที่มันพบและสามารถอ่านได้ สามารถสั่งให้แบชไม่รันคำสั่งโดยออปชัน --noprofile
ถ้าล็อกอินเชลล์จบการทำงาน แบชจะไปรันคำสั่งใน ~/.bash_logout ถ้ามี
ถ้าเรียกแบชเป็นเชลล์โต้ตอบที่ไม่ใช้ล็อกอิน มันจะไปอ่านและรันคำสั่งใน ~/.bashrc ถ้ามี สามารถสั่งไม่ให้รันได้ด้วยออปชัน --norc และสั่งให้รันจากไฟล์ที่กำหนดด้วยออปชัน --rcfile
ถ้าเรียกแบชเป็นเชลล์เพื่อรันสคริปต์ มันจะตรวจสอบตัวแปร BASH_ENV และรันคำสั่งในไฟล์ที่ระบุแบชไม่ใช้ตัวแปร PATH ในการค้นหาไฟล์
ถ้าเรียกแบชโดยใช้ชื่อ sh มันจะเลียนแบบการทำงานของบอร์นเชลล์มากที่สุดเท่าที่ทำได้ ตราบเท่าที่ยังเป็นตามมาตรฐาน POSIX เมื่อเป็นล็อกอินเชลล์หรือมีออปชัน --login มันจะไปหา /etc/profile และ ~/.profile ตามลำดับ และสามารถใช้ --noprofile เพื่องดการรันคำสั่งเริ่มต้น เมื่อไม่เป็นล็อกอินเชลล์ มันจะหาไฟล์ที่กำหนดโดยตัวแปร ENV และเมื่อเรียกเพื่อรันสคริปจะไม่รันคำสั่งเริ่มต้นเลย
ถ้าแบชทำงานในโหมด POSIX โดยใช้ออพชัน --posix จะรันคำสั่งจากไฟล์ที่ระบุใน ENV เท่านั้นเพื่อเป็นไปตามมาตรฐาน POSIX
แบชยังตรวจว่ามันถูกเรียกจาก remote shell daemon ซึ่งมักเป็น rshd หรือไม่ ถ้าใช่ ก็จะรันคำสั่งใน ~/.bashrc (ยกเลิกได้โดยออพชัน --norc และเปลี่ยนไฟล์โดยใช้ออพชัน --rcfile แต่ปกติ rshd มักไม่สามารถรันเชลล์โดยระบุออพชันเหล่านี้)