Bash
จากวิกิพีเดีย สารานุกรมเสรี
- บทความนี้มีชื่อเป็นภาษาอังกฤษ เนื่องจากยังไม่มีชื่อภาษาไทยที่กระชับหรือเหมาะสม ไม่รู้วิธีอ่านในภาษาไทย หรือต้องการคงชื่อเฉพาะไว้ตามต้นฉบับ
- ชื่อของบทความนี้ไม่ถูกต้องเนื่องจากข้อจำกัดทางเทคนิค ชื่อที่ถูกต้องคือ bash
GNU Bourne-Again SHell | |
---|---|
ภาพหน้าจอ |
|
ผู้พัฒนา | เช็ต เรมี |
รุ่นเสถียรล่าสุด | 3.1 (7 ธันวาคม พ.ศ. 2548) |
รุ่นทดลองล่าสุด | {{{latest_beta_version}}} ({{{latest_beta_date}}}) |
OS | ลีนุกซ์, แมคโอเอสเท็น, ยูนิกซ์, ไมโครซอฟท์วินโดวส์ (ผ่านทาง Cygwin) |
ชนิด | เชลล์ยูนิกซ์ |
ลิขสิทธิ์ | GPL |
เว็บไซต์ | เว็บเพจของ GNU Bash |
Bash เป็นเชลล์ยูนิกซ์ที่พัฒนาขึ้นสำหรับโครงการกนู ชื่อนี้ย่อมาจาก Bourne-Again SHell ซึ่งเป็นการล้อเลียนโปรแกรมเชลล์อีกตัวคือ บอร์นเชลล์ (Bourne shell) Bash เขียนมาใช้แทนบอร์นเชลล์ซึ่งเขียนขึ้นสำหรับยูนิกซ์เวอร์ชัน 7 โดย สตีเฟน บอร์น (Stephen Bourne) เมื่อประมาณ ค.ศ. 1978 ไบรอัน ฟอกซ์ (Brian Fox) เขียนเชลล์ bash ไว้เมื่อ ค.ศ. 1987 ตั้งแต่ ค.ศ. 1990 เป็นต้นมาผู้ดูแลพัฒนาหลักคือ เช็ต เรมี (Chet Ramey) ในลีนุกซ์ส่วนใหญ่และในแมคโอเอสเท็นใช้ bash เป็นเชลล์มาตรฐาน bash สามารถทำงานบนระบบปฏิบัติการยูนิกซ์และใกล้เคียง ยังปรับปรุงให้สามารถทำงานในไมโครซอฟท์วินโดวส์โดยโครงการ Cygwin และในดอสโดยโครงการ DJGPP ด้วย
สารบัญ |
[แก้] รูปแบบคำสั่ง
รูปแบบคำสั่งของ bash ครอบคลุมคำสั่งทั้งหมดของบอร์นเชลล์ ดังนั้นสคริปต์ที่เขียนสำหรับบอร์นเชลล์ส่วนใหญ่จึงสามารถรันใน bash ได้โดยไม่ต้องแก้ไข จะมียกเว้นก็เช่น สคริปต์ที่เรียกใช้ตัวแปรพิเศษในบอร์นเชลล์ หรือใช้คำสั่งภายในของบอร์นเชลล์
รูปแบบคำสั่งใน bash ยังได้รับแนวความคิดจาก คอร์นเชลล์ (ksh) และ C เชลล์ (csh) เช่น การแก้ไขคำสั่ง จำคำสั่งเก่า ตัวแปร $RANDOM และ $PPID เป็นต้น เวลาใช้เป็นเชลล์ทางคอมมานด์ไลน์ bash จะเติมชื่อโปรแกรม ชื่อไฟล์ ชื่อตัวแปร ให้ครบโดยอัตโนมัต เมื่อผู้ใช้กดปุ่ม TAB
ต่อไปนี้เป็นตัวอย่างรูปแบบคำสั่งที่เพิ่มเติมมาใน bash ที่ Bourne shell ไม่มี
[แก้] การคำนวนเลขจำนวนเต็ม
bash สามารถคำนวนตัวเลขจำนวนเต็มโดยไม่ต้องเรียกใช้โปรแกรมอื่น ในการคำนวนจะใช้คำสั่ง ((...)) หรือ $[...]
VAR=55 # กำหนดค่า 55 ให้กับตัวแปร VAR ((VAR = VAR + 1)) # บวกหนึ่งให้ตัวแปร VAR สังเกตว่าไม่ใช้อักษร '$' ((++VAR)) # อีกวิธีในการบวกหนึ่งให้กับ VAR ((VAR++)) # อีกวิธีในการบวกหนึ่งให้กับ VAR echo $[VAR * 22] # นำ VAR ไปคูณกับ 22 แล้วแทนที่ในคำสั่ง echo $((VAR * 22)) # อีกวิธีในการนำ VAR ไปคูณกับ 22 แล้วแทนที่ในคำสั่ง
คำสั่ง ((...)) ยังใช้ในการตรวจสอบเงื่อนไข ว่าเป็นจริงหรือเท็จ เช่น
if ((VAR == Y * 3 + X * 2)) then echo Yes fi ((Z > 23)) && echo Yes
สามารถใช้เงื่อนไข '==', '!=', '>', '<', '>=' และ '<=' ในคำสั่ง ((...))
bash ไม่สามารถคำนวนค่าเป็นจำนวนทศนิยมได้ มีเพียง คอร์นเชลล์ และ Z เชลล์ เท่านั้นที่ทำได้
[แก้] เปลี่ยนทิศทาง I/O
bash มีรูปแบบคำสั่งหลายอย่างในการเปลี่ยนทิศทาง I/O ตัวอย่างเช่น ถ้าต้องการเปลี่ยน standard output (stdout) และ standard error (stderr) ไปเก็บในไฟล์ สามารถใช้รูปแบบ
command &> file
ซึ่งง่ายกว่าบอร์นเชลล์ที่ต้องพิมพ์ "command > file 2>&1"
ตั้งแต่รุ่น 2.05b เป็นต้นมา bash สามารถดึงข้อความสตริงไปเข้า standard input (เรียกว่า "here documents" หรือ "heredocs") ได้ดังนี้
command << "สตริงที่ส่งไป standard input"
ถ้าในสตริงมีตัวอักษรช่องว่าง หรือตัวอักษรพิเศษอื่น ๆ ต้องใส่สตริงในเครื่องหมายคำพูด
ตัวอย่าง: Redirect standard output to a file, write data, close file, reset stdout
# สร้างไฟล์เดสคริปเทอร์ (Filedescriptor, FD) 6 ให้ชี้ไปยัง stdout (FD 1) exec 6>&1 # เปลี่ยน stdout ให้เขียนลงไฟล์ "test.data" แทน exec 1>test.data # ใส่ข้อมูลในไฟล์ echo "data:data:data" # ปิดไฟล์ "test.data" exec 1>&- # เปลี่ยน stdout ให้เหมือนกับ FD 6 (รีเซต stdout ให้กลับเหมือนเดิม) exec 1>&6 # ปิด FD6 exec 6>&-
เปิดและปิดไฟล์
# เปิดไฟล์ test.data เพื่ออ่าน ใช้ FD 6 exec 6<test.data # อ่านจนกว่าจะจบไฟล์ while read -u 6 dta do echo "$dta" done # ปิดไฟล์ test.data exec 6<&-
เก็บผลลัพธ์ของคำสั่งภายนอก
# รันโปรแกรม 'find' และเก็บผลลัพธ์ไว้ในตัวแปร VAR # ค้นหาไฟล์ที่ลงท้ายด้วยตัวอักษร "h" VAR=$(find . -name "*h")
[แก้] การตรวจสอบ regular expressions
bash 3.0 สนับสนุนการตรวจสอบ regular expression ในตัว bash เองโดยใช้รูปแบบคำสั่งที่คล้ายกับภาษาเพิร์ลดังนี้
[[ string =~ regex ]]
รูปแบบของ regular expression จะเหมือนกับที่กำหนดในหน้าแมนเพจ regex(7) ผลลัพธ์ที่ได้จะเป็น 0 ถ้า string ตรงกับ string และ 1 ถ้าไม่ตรงกัน ข้อความในวงเล็บภายใน regular expression สามารถอ่านได้จากตัวแปร BASH_REMATCH ดังต่อไปนี้
if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]] then echo ข้อความตรงกับที่ค้นหา\! echo $BASH_REMATCH -- แสดง foobarbletch echo ${BASH_REMATCH[1]} -- แสดง bar echo ${BASH_REMATCH[2]} -- แสดง etch fi
รูปแบบคำสั่งนี้ ทำงานมีประสิทธิภาพกว่าการรันโปรแกรม grep ต่างหาก ถ้าใน regular expression หรือสตริงมีตัวอักษรว่าง หรือตัวอักษรพิเศษ (เช่น '*' หรือ '?') ต้องใส่ในเครื่องหมายคำพูด
[แก้] การแปลงแบ็คสแลช
ข้อความในรูป $'string' จะถูกจัดการเป็นพิเศษ ข้อความดังกล่าวจะถูกแปลงเป็นstring โดยที่ตัวอักษรที่ขึ้นต้นด้วยแบคสแลช (\) จะถูกแปลงตามที่กำหนดไว้ในภาษาซี ดังตารางต่อไปนี้
ข้อความเดิม | แปลงเป็น |
---|---|
\a | ตัวอักษร alert หรือ bell |
\b | ตัวอักษร backspace |
\e | ตัวอักษร escape |
\f | ตัวอักษร form feed |
\n | ตัวอักษร new line |
\r | ตัวอักษร carriage return |
\t | ตัวอักษร horizontal tab |
\v | ตัวอักษร vertical tab |
\\ | ตัวอักษร \ |
\' | ตัวอักษร ' |
\nnn | ตัวอักษร 8 บิตที่มีเลขฐานแปดเป็น nnn (หนึ่งถึงสามหลัก) |
\xHH | ตัวอักษร 8 บิตที่มีเลขฐานสิบหกเป็น HH (หนึ่งหรือสองหลัก) |
\cx | ตัวอักษร control-X |
หลังจากแปลงแล้วข้อความจะอยู่ภายในเครื่องหมายคำพูด '...' เหมือนกับว่าไม่มีตัวอักษร $ อยู่
ข้อความตัวอักษรที่อยู่ภายใน $"..." จะถูกแปลตามโลเคล (locale) ปัจจุบัน ถ้าโลเคลปัจจุบันคือ C หรือ POSIX เครื่องหมายดอลลาร์จะไม่มีผล แต่ถ้าสตริงถูกแปลและแทนที่ ผลลัพธ์จะอยู่ในเครื่องหมายคำพูด "..."
[แก้] สคริปเริ่มทำงาน
เมื่อ bash เริ่มทำงาน มันจะทำคำสั่งในสคริปเริ่มต้นต่าง ๆ กันแล้วแต่กรณี
ถ้าเรียก bash เป็นเชลล์ล็อกอิน หรือเรียกโดยมีออพชัน --login มันจะไปค้นหา /etc/profile ตามด้วย ~/.bash_profile, ~/bash_login และ ~/.profile ตามลำดับ มันจะรันคำสั่งในไฟล์แรกที่มันพบและสามารถอ่านได้ สามารถสั่งให้ bash ไม่รันคำสั่งโดยออพชัน --noprofile
ถ้าล็อกอินเชลล์ฺจบการทำงาน bash จะไปรันคำสั่งใน ~/.bash_logout ถ้ามี
ถ้าเรียก bash เป็นเชลล์โต้ตอบที่ไม่ใช้ล็อกอิน มันจะไปอ่านและรันคำสั่งใน ~/.bashrc ถ้ามี สามารถสั่งไม่ให้รันได้ด้วยออพชัน --norc และสั่งให้รันจากไฟล์ที่กำหนดด้วยออพชัน --rcfile
ถ้าเรียก bash เป็นเชลล์เพื่อรันสคริป มันจะตรวจสอบตัวแปร BASH_ENV และรันคำสั่งในไฟล์ที่ระบุ bash ไม่ใช้ตัวแปร PATH ในการค้นหาไฟล์
ถ้าเรียก bash โดยใช้ชื่อ sh มันจะเลียนแบบการทำงานของบอร์นเชลล์มากที่สุดเท่าที่ทำได้ ตราบเท่าที่ยังเป็นตามมาตรฐาน POSIX เมื่อเป็นล็อกอินเชลล์หรือมีออพชัน --login มันจะไปหา /etc/profile และ ~/.profile ตามลำดับ และสามารถใช้ --noprofile เพื่องดการรันคำสั่งเริ่มต้น เมื่อไม่เป็นล็อกอินเชลล์ มันจะหาไฟล์ที่กำหนดโดยตัวแปร ENV และเมื่อเรียกเพื่อรันสคริปจะไม่รันคำสั่งเริ่มต้นเลย
ถ้า bash ทำงานในโหมด POSIX โดยใช้ออพชัน --posix จะรันคำสั่งจากไฟล์ที่ระบุใน ENV เท่านั้นเพื่อเป็นไปตามมาตรฐาน POSIX
bash ยังตรวจว่ามันถูกเรียกจาก remote shell daemon ซึ่งมักเป็น rshd หรือไม่ ถ้าใช่ ก็จะรันคำสั่งใน ~/.bashrc (ยกเลิกได้โดยออพชัน --norc และเปลี่ยนไฟล์โดยใช้ออพชัน --rcfile แต่ปกติ rshd มักไม่สามารถรันเชลล์โดยระบุออพชันเหล่านี้)