Bash
จากวิกิพีเดีย สารานุกรมเสรี
- บทความนี้มีชื่อเป็นภาษาอังกฤษ เนื่องจากยังไม่มีชื่อภาษาไทยที่กระชับ เหมาะสม หรือไม่รู้วิธีอ่านในภาษาไทย
- ชื่อที่ถูกต้องของบทความนี้คือ bash ชื่อที่แสดงไม่ถูกต้องเนื่องจากข้อจำกัดทางเทคนิค
GNU Bourne-Again SHell | |
ผู้พัฒนา: | เช็ต เรมี |
---|---|
รุ่นล่าสุด: | 3.1 / 7 ธันวาคม พ.ศ. 2548 |
ระบบปฏิบัติการ: | ลีนุกซ์, แมคโอเอสเท็น, ยูนิกซ์, ไมโครซอฟท์วินโดวส์ (ผ่านทาง Cygwin) |
ประเภท: | เชลล์ยูนิกซ์ |
ลิขสิทธิ์: | GPL |
เว็บไซต์: | เว็บเพจของ GNU Bash |
bash เป็นเชลล์ยูนิกซ์ที่พัฒนาขึ้นสำหรับโครงการกนู ชื่อนี้ย่อมาจาก Bourne-Again SHell ซึ่งเป็นการล้อเลียนโปรแกรมเชลล์อีกตัวคือ บอร์นเชลล์ (Bourne shell) Bash เขียนมาใช้แทนบอร์นเชลล์ซึ่งเขียนขึ้นสำหรับยูนิกซ์เวอร์ชัน 7 โดย สตีเฟน บอร์น (Stephen Bourne) เมื่อประมาณ ค.ศ. 1978 ไบรอัน ฟอกซ์ (Brian Fox) เขียนเชลล์ bash ไว้เมื่อ ค.ศ. 1987 ตั้งแต่ ค.ศ. 1990 เป็นต้นมาผู้ดูแลพัฒนาหลักคือ เช็ต เรมี (Chet Ramey)[1]}} ในลีนุกซ์ส่วนใหญ่และในแมคโอเอสเท็นใช้ 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 มักไม่สามารถรันเชลล์โดยระบุออพชันเหล่านี้)
[แก้] อ้างอิง
- Bash Reference Manual. เรียกข้อมูลวันที่ 2008-06-21
- ^ Ramey, Chet. Bash - the GNU shell (Reflections and Lessons Learned). เรียกข้อมูลวันที่ 2008-01-15