เรียนรู้ความแตกต่างระหว่างการจัดหาและการฟอร์กใน Bash
จุดสนใจหลักของบทความนี้คือการทำความเข้าใจอย่างชัดเจนว่าจะเกิดอะไรขึ้นเมื่อคุณเรียกใช้สคริปต์ สคริปต์เทียบกับแหล่งที่มา ใน bash ขั้นแรก เราจะเข้าใจอย่างชัดเจนถึงวิธีการส่งโปรแกรมเมื่อคุณเรียกใช้สคริปต์ในรูปแบบต่างๆ
หมายเหตุ: การสร้างสคริปต์ด้วยส่วนขยายไม่สำคัญ สคริปต์จะทำงานได้ดีแม้ว่าจะไม่มีส่วนขยายก็ตาม
โดยพื้นฐานแล้ว ทุกสคริปต์จะเริ่มต้นด้วยบรรทัดที่เรียกว่า shebang(#!) สัญลักษณ์ Hash ใน bash จะถูกตีความว่าเป็นความคิดเห็น แต่ shebang มีความหมายพิเศษ มันบอกให้ bash ส่งโปรแกรมในล่ามใดก็ตามที่คุณพูดถึงใน shebang
ด้านล่างนี้เป็นโปรแกรมตัวอย่าง และฉันกำลังระบุ bash เป็นล่ามของฉัน
cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"
chmod +x Hello_world.sh
ตอนนี้เพื่อรันสคริปต์ คุณสามารถทำได้สองวิธี
- ใช้เส้นทางสัมพันธ์เพื่อเรียกสคริปต์ ย้ายไปยังไดเร็กทอรีที่มีสคริปต์อยู่และเรียกใช้ ./Hello_world.sh
- ใช้เส้นทางสัมบูรณ์เพื่อเรียกสคริปต์ จากที่ใดก็ได้ในระบบไฟล์ให้พิมพ์เส้นทางแบบเต็มไปยังสคริปต์
./Hello_world.sh
pwd
/home/karthick/Hello_world
ตอนนี้เรามาดูว่าจะเกิดอะไรขึ้นเมื่อคุณพยายามส่งโปรแกรมของคุณโดยไม่มี shebang หากไม่มี shebang โปรแกรมจะถูกส่งไปยังเชลล์ปัจจุบันที่คุณใช้อยู่ ในกรณีของฉันคือ Bash (/bin/bashแข็งแกร่ง>)
ผมขอแสดงตัวอย่าง ฉันกำลังสร้างสคริปต์ python โดยไม่มี shebang และเมื่อฉันเรียกใช้โปรแกรม bash ไม่รู้ว่าควรส่งโปรแกรมนี้ไปยังล่าม python แทน โปรแกรมจะรันโปรแกรม ในเปลือกปัจจุบัน
cat > run-py.py
echo $SHELL
print("Hello world")
chmod +x run-py.py
./run-py.py
ในกรณีนี้ คุณสามารถเรียกโปรแกรมโดยระบุว่าควรส่งโปรแกรมไปให้ล่ามคนไหน หรือเพียงเพิ่มบรรทัด shebang ซึ่งแนะนำให้ใช้เสมอ
which python3
$(which python3) /home/karthick/run_py.py
ตอนนี้คุณรู้วิธีเรียกสคริปต์แล้ว ขั้นตอนต่อไปคือการทำความเข้าใจว่าจะเกิดอะไรขึ้นเมื่อเราเรียกสคริปต์ เมื่อคุณเรียกใช้สคริปต์ตามที่แสดงในตัวอย่างข้างต้น สคริปต์จะสร้างกระบวนการลูก (การฟอร์กกิ้ง) และสคริปต์จะถูกส่งไปยังกระบวนการลูก ฉันรันสคริปต์ตัวอย่างที่จะรันคำสั่งต่อไปนี้และแสดงว่าสคริปต์ถูกส่งไปยังกระบวนการลูก
ps -ef --forest | grep -i bash
สคริปต์อาจมีกระบวนการย่อยได้หลายรายการและขึ้นอยู่กับโค้ดของเรา มีข้อสังเกตว่าตัวแปรสภาพแวดล้อมที่สร้างโดยตัวห้อยจะถูกละทิ้งเมื่อเสร็จสิ้น กระบวนการลูกสามารถเข้าถึงตัวแปรที่สร้างโดยกระบวนการหลักโดยการส่งออก แต่กระบวนการหลักไม่สามารถเข้าถึงตัวแปรที่สร้างโดยกระบวนการลูกได้
ดูบทความด้านล่างเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับวิธีการทำงานของตัวแปรและวิธีการส่งออกตัวแปร
- การทำความเข้าใจและการเขียน 'ตัวแปร Linux' ในการเขียนสคริปต์เชลล์
- เรียนรู้ความแตกต่างระหว่าง $$และ $BASHPID ใน Bash
การจัดหาสคริปต์
“แหล่งที่มา ” คือคำสั่งในตัวของเชลล์ที่อ่านไฟล์ที่ส่งเป็นอาร์กิวเมนต์ไปยังไฟล์นั้น และเรียกใช้โค้ดในสภาพแวดล้อมของเชลล์ปัจจุบัน กรณีการใช้งานที่เหมาะสมที่คุณใช้เป็นส่วนใหญ่คือการแก้ไขการกำหนดค่าของคุณใน .bashrc
หรือ .bash_profile
และโหลดการเปลี่ยนแปลงอีกครั้งโดยใช้ คำสั่ง source
type -a source
มีสองวิธีในการรัน คำสั่งแหล่งที่มา คุณสามารถเลือกใครก็ได้จากสองไวยากรณ์และเป็นทางเลือกส่วนบุคคล
source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]
ให้ฉันสาธิตวิธีการทำงานของแหล่งที่มาจริง ฉันจะสร้างเชลล์สคริปต์สองตัว สคริปต์แรก (Module.sh) กำลังจะเก็บตัวแปรและฟังก์ชันบางอย่างไว้ สคริปต์ที่สอง (Main.sh) กำลังจะพิมพ์ตัวแปรและเรียกใช้ฟังก์ชัน
ไฟล์ Module.sh
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo “Function f1 is called”
}
ไฟล์ Main.sh
#!/usr/bin/env bash
echo $VAR1
f1
ตั้งค่าการอนุญาตการดำเนินการสำหรับสคริปต์และเรียกสคริปต์หลัก “main.sh ” ตอนนี้ สคริปต์นี้จะพยายามค้นหาฟังก์ชัน f1
และตัวแปร VAR1
ในสภาพแวดล้อมเชลล์ปัจจุบัน และจะล้มเหลวโดยไม่พบคำสั่ง
bash main.sh
ตอนนี้เรามารันคำสั่ง source ภายในสคริปต์ซึ่งจะโหลดตัวแปรและฟังก์ชันลงในสภาพแวดล้อมเชลล์ปัจจุบันและจะสามารถเข้าถึงได้โดย “main.sh ”
ไฟล์ Module.sh
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo "Function f1 is called"
}
ไฟล์ Main.sh
#!/usr/bin/env bash
source module.sh Tecmint
echo $VAR1
f1
ตอนนี้รันสคริปต์อีกครั้งและดู
bash main.sh
แหล่งที่มามีประโยชน์มากใน bash เพื่อปฏิบัติตามแนวทางการเขียนโปรแกรมแบบโมดูลาร์ในการสร้างเชลล์สคริปต์ของเรา เราสามารถแบ่งโค้ดของเราออกเป็นโมดูลเล็กๆ และสามารถใช้ได้ในหลายโปรแกรม ด้วยวิธีนี้ เราสามารถปฏิบัติตามหลักการ แห้ง (อย่าพูดซ้ำตัวเอง)
เพียงเท่านี้สำหรับบทความนี้ เราได้พูดคุยสั้น ๆ ถึงความแตกต่างระหว่างการจัดหาและการฟอร์กใน bash อ่านบทความและแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา