ค้นหาเว็บไซต์

เรียนรู้ความแตกต่างระหว่างการจัดหาและการฟอร์กใน 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 อ่านบทความและแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา