การแยกการกำหนดค่าโปรแกรมออกจากโค้ดเป็นสิ่งสำคัญ มันช่วยให้ผู้ไม่ใช่โปรแกรมเมอร์สามารถเปลี่ยนแปลงการกำหนดค่าได้โดยไม่ต้องแก้ไขโค้ดของโปรแกรม ด้วยไฟล์ executable ที่คอมไพล์แล้ว นั่นจะเป็นไปไม่ได้สำหรับผู้ไม่ใช่โปรแกรมเมอร์ เพราะไม่เพียงแต่ต้องเข้าถึง source files (ซึ่งเรามีกับโปรแกรม open source) แต่ยังต้องมีทักษะของโปรแกรมเมอร์ คนน้อยมากที่มีทักษะนั้น และคนส่วนใหญ่ไม่ต้องการเรียนรู้
ด้วยภาษา shell เช่น Bash การเข้าถึง source code พร้อมใช้งานโดยนิยาม เนื่องจาก shell scripts ไม่ได้ถูกคอมไพล์เป็นรูปแบบ binary แม้ด้วยความเปิดเผยนั้น ก็ไม่ใช่ไอเดียที่ดีมากนัก ที่จะให้ผู้ไม่ใช่โปรแกรมเมอร์ไปขุดใน shell scripts และแก้ไข แม้นักพัฒนาและ sysadmins ที่รู้จักมาก ก็อาจทำการเปลี่ยนแปลงโดยไม่ได้ตั้งใจซึ่งทำให้เกิดข้อผิดพลาด หรือแย่กว่านั้น
ดังนั้น การวางรายการกำหนดค่าไว้ในไฟล์ข้อความที่ดูแลรักษาง่าย จะให้การแยกแยะ และอนุญาตให้ผู้ไม่ใช่โปรแกรมเมอร์แก้ไของค์ประกอบการกำหนดค่าได้โดยไม่มีอันตรายที่จะทำการเปลี่ยนแปลงโค้ดโดยไม่ได้ตั้งใจ นักพัฒนาหลายคนทำเช่นนี้สำหรับโปรแกรมที่เขียนในภาษาที่คอมไพล์ เพราะพวกเขาไม่คาดหวังว่าผู้ใช้จะเป็นนักพัฒนา ด้วยเหตุผลเดียวกันหลายประการ จึงสมเหตุสมผลที่จะทำเช่นนี้กับภาษา shell ที่ตีความ (interpreted) ด้วย
วิธีปกติ
เหมือนกับภาษาอื่นๆ คุณสามารถเขียนโค้ดสำหรับโปรแกรม Bash ที่อ่านและ parse ไฟล์การกำหนดค่าข้อความ ASCII อ่านชื่อตัวแปร และตั้งค่าเมื่อโค้ดโปรแกรมทำงาน ตัวอย่างเช่น ไฟล์การกำหนดค่าอาจมีลักษณะดังนี้:
var1=LinuxGeek46 var2=Opensource.com
โปรแกรมจะอ่านไฟล์นั้น parse แต่ละบรรทัด และตั้งค่าให้แต่ละตัวแปร
Sourcing (การนำเข้า)
Bash ใช้วิธีที่ง่ายกว่ามากสำหรับการ parse และตั้งค่าตัวแปร เรียกว่า sourcing การ source ไฟล์ภายนอกจากโปรแกรม shell ที่ executable เป็นวิธีง่ายๆ สำหรับรวมเนื้อหาของไฟล์นั้นเข้าไปในโปรแกรม shell อย่างสมบูรณ์ ในความหมายหนึ่ง นี่คล้ายกับคำสั่ง include ของภาษาที่คอมไพล์ ที่รวมไฟล์ไลบรารีใน runtime ไฟล์เช่นนี้สามารถรวมโค้ด Bash ใดๆ ได้ รวมถึงการกำหนดค่าตัวแปร
เช่นปกติ มันง่ายกว่าที่จะสาธิต มากกว่าการอธิบาย
ก่อนอื่น สร้างไดเรกทอรี ~/bin (หากยังไม่มี) และทำให้เป็น present working directory (PWD) มาตรฐานลำดับชั้นไฟล์ระบบ Linux กำหนด ~/bin เป็นสถานที่ที่เหมาะสมสำหรับผู้ใช้จัดเก็บไฟล์ executable ของตนเอง
สร้างไฟล์ใหม่ในไดเรกทอรีนี้ ชื่อ main และทำให้ executable:
[dboth@david bin]$ touch main [dboth@david bin]$ chmod +x main [dboth@david bin]$
เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์ executable นี้:
#!/bin/bash Name="LinuxGeek" echo $Name
และรันโปรแกรม Bash นี้:
[dboth@david bin]$ ./main LinuxGeek [dboth@david bin]$
สร้างไฟล์ใหม่และเรียกว่า ~/bin/data ไฟล์นี้ไม่จำเป็นต้อง executable เพิ่มข้อมูลต่อไปนี้เข้าไป:
# Sourced code and variables echo "This is the sourced code from the data file." FirstName="David" LastName="Both"
เพิ่มสามบรรทัดให้โปรแกรม main ให้มีลักษณะดังนี้:
#!/bin/bash Name="LinuxGeek" echo $Name source ~/bin/data echo "First name: $FirstName" echo "LastName: $LastName"
รันโปรแกรมอีกครั้ง:
[dboth@david bin]$ ./main LinuxGeek This is the sourced code from the data file. First name: David LastName: Both [dboth@david bin]$
มีอีกหนึ่งอย่างที่น่าสนใจเกี่ยวกับ sourcing คุณสามารถใช้จุดเดียว (.) เป็น shortcut สำหรับคำสั่ง source เปลี่ยนไฟล์ main ให้ใช้ . แทน source:
#!/bin/bash Name="LinuxGeek" echo $Name . ~/bin/data echo "First name: $FirstName" echo "LastName: $LastName"
และรันโปรแกรมอีกครั้ง ผลลัพธ์ควรเหมือนกับการรันครั้งก่อนหน้าทุกประการ
การเริ่มต้น Bash
ทุกโฮสต์ Linux ที่ใช้ Bash – ซึ่งเป็นทุกตัวเกือบหมด เพราะ Bash เป็น default shell สำหรับทุก distributions – รวมตัวอย่าง built-in ที่ยอดเยี่ยมของ sourcing ไว้
ทุกครั้งที่ Bash shell เริ่มต้น สภาพแวดล้อมของมันต้องถูกกำหนดค่าให้ใช้งานได้ มีไฟล์หลัก 5 ไฟล์ และ 1 ไดเรกทอรี ที่ใช้กำหนดค่าสภาพแวดล้อมของ Bash พวกเขาถูกรายการพร้อมกับฟังก์ชันหลักของพวกเขา:
/etc/profile: สภาพแวดล้อมระบบและโปรแกรมเริ่มต้น/etc/bashrc: ฟังก์ชันและ aliases ระบบ/etc/profile.d/: ไดเรกทอรีที่มีสคริปต์ระบบสำหรับกำหนดค่าเครื่องมือบรรทัดคำสั่งต่างๆ เช่นvimและmcและสคริปต์กำหนดค่าที่ sysadmin สร้างเอง~/.bash_profile: สภาพแวดล้อมและโปรแกรมเริ่มต้นเฉพาะผู้ใช้~/.bashrc: aliases และฟังก์ชันเฉพาะผู้ใช้~/.bash_logout: คำสั่งเฉพาะผู้ใช้ที่จะรันเมื่อผู้ใช้ออกจากระบบ
ลองติดตามลำดับการ execute ผ่านไฟล์เหล่านี้ และกำหนดว่าลำดับไหนใช้สำหรับ non-login Bash initialization เทียบกับ log-in Bash initialization ผมทำสิ่งนี้ใน Chapter 17 ของ Volume 1 ในชุดการฝึกอบรม Linux ของผม Using and administering Linux: Zero to sysadmin
ผมจะให้คุณ hint หนึ่ง ทุกอย่างเริ่มต้นด้วยสคริปต์ ~/.bashrc
สรุป
บทความนี้สำรวจ sourcing สำหรับดึงโค้ดและการกำหนดค่าตัวแปรเข้าไปในโปรแกรม Bash วิธีการ parse ตัวแปรจากไฟล์ config นี้ เร็ว ง่าย และยืดหยุ่น มันให้วิธีการแยกโค้ด Bash ออกจากการกำหนดค่าตัวแปร เพื่อให้ผู้ไม่ใช่โปรแกรมเมอร์ตั้งค่าตัวแปรเหล่านั้นได้