จุดสนใจหลักของบทความนี้คือการทำความเข้าใจอย่างชัดเจนว่าเกิดอะไรขึ้นเมื่อคุณเรียกใช้ สคริปต์เทียบกับแหล่งที่มา สคริปต์ในทุบตี ขั้นแรก เราจะเข้าใจอย่างชัดเจนถึงวิธีการส่งโปรแกรมเมื่อคุณเรียกใช้สคริปต์ในรูปแบบต่างๆ
หมายเหตุ :การสร้างสคริปต์ด้วยส่วนขยายไม่สำคัญ สคริปต์จะทำงานได้ดีแม้ไม่มีส่วนขยาย
โดยพื้นฐานแล้ว ทุกสคริปต์เริ่มต้นด้วยบรรทัดที่เรียกว่า shebang(#!) . แฮช สัญลักษณ์ใน 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 )
ให้ฉันแสดงตัวอย่าง ฉันกำลังสร้างสคริปต์หลามโดยไม่มี shebang และเมื่อฉันเรียกโปรแกรม ทุบตี ไม่ทราบว่าควรส่งโปรแกรมนี้ไปยังล่ามหลามแทน มันจะเรียกใช้โปรแกรมในเชลล์ปัจจุบัน
$ 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 Variables' ใน Shell Scripting
- เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash
การจัดหาสคริปต์
“ที่มา ” เป็นคำสั่งในตัวของเชลล์ที่อ่านไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์และรันโค้ดในสภาพแวดล้อมของเชลล์ปัจจุบัน กรณีการใช้งานที่เหมาะสมที่คุณใช้เป็นส่วนใหญ่คือการแก้ไขการกำหนดค่าของคุณใน .bashrc
หรือ .bash_profile
และโหลดการเปลี่ยนแปลงใหม่โดยใช้ คำสั่งแหล่งที่มา .
$ type -a source

มีสองวิธีในการรัน source command . คุณสามารถเลือกใครก็ได้จากสองรูปแบบและเป็นทางเลือกส่วนบุคคล
$ 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

แหล่งที่มา มีประโยชน์มากใน ทุบตี เพื่อปฏิบัติตามแนวทางการเขียนโปรแกรมแบบแยกส่วนในการสร้างเชลล์สคริปต์ของเรา เราสามารถแบ่งโค้ดของเราออกเป็นโมดูลเล็กๆ และสามารถใช้ได้ในหลายโปรแกรม ด้วยวิธีเหล่านี้ เราสามารถปฏิบัติตาม DRY (อย่าทำซ้ำตัวเอง ) หลักการ
เพียงเท่านี้สำหรับบทความนี้ เราได้พูดคุยสั้น ๆ เกี่ยวกับความแตกต่างระหว่างการจัดหาและการฟอร์กในทุบตี อ่านบทความและแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา