Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

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

หมายเหตุ :การสร้างสคริปต์ด้วยส่วนขยายไม่สำคัญ สคริปต์จะทำงานได้ดีแม้ไม่มีส่วนขยาย

โดยพื้นฐานแล้ว ทุกสคริปต์เริ่มต้นด้วยบรรทัดที่เรียกว่า 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
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

ตอนนี้เรามาดูกันว่าจะเกิดอะไรขึ้นเมื่อคุณพยายามส่งโปรแกรมของคุณโดยไม่มี shebang . ในกรณีที่ไม่มี shebang โปรแกรมจะถูกส่งไปยังเชลล์ที่คุณใช้งานอยู่ในปัจจุบัน ในกรณีของฉัน มันคือ Bash (/bin/bash )

ให้ฉันแสดงตัวอย่าง ฉันกำลังสร้างสคริปต์หลามโดยไม่มี shebang และเมื่อฉันเรียกโปรแกรม ทุบตี ไม่ทราบว่าควรส่งโปรแกรมนี้ไปยังล่ามหลามแทน มันจะเรียกใช้โปรแกรมในเชลล์ปัจจุบัน

$ cat > run-py.py
echo $SHELL
print("Hello world")

$ chmod +x run-py.py
$ ./run-py.py
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

ในกรณีนี้ คุณสามารถเรียกโปรแกรมได้โดยการพูดถึงว่าควรส่งล่ามไปที่ใด หรือเพียงแค่เพิ่ม shebang ไลน์ที่แนะนำเสมอมา

# which python3
$(which python3) /home/karthick/run_py.py
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

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

$ ps -ef --forest | grep -i bash
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

อาจมีกระบวนการย่อยหลายกระบวนการซึ่งเป็นส่วนหนึ่งของสคริปต์และขึ้นอยู่กับรหัสของเรา เป็นที่น่าสังเกตว่าตัวแปรสภาพแวดล้อมที่สร้างขึ้นโดยตัวห้อยจะลดลงเมื่อเสร็จสิ้น กระบวนการลูกสามารถเข้าถึงตัวแปรที่สร้างโดยกระบวนการหลักโดยการส่งออก แต่กระบวนการหลักไม่สามารถเข้าถึงตัวแปรที่สร้างโดยกระบวนการลูกได้

ดูบทความด้านล่างเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับวิธีการทำงานของตัวแปรและวิธีส่งออกตัวแปร

  • การทำความเข้าใจและการเขียน 'Linux Variables' ใน Shell Scripting
  • เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash

การจัดหาสคริปต์

ที่มา ” เป็นคำสั่งในตัวของเชลล์ที่อ่านไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์และรันโค้ดในสภาพแวดล้อมของเชลล์ปัจจุบัน กรณีการใช้งานที่เหมาะสมที่คุณใช้เป็นส่วนใหญ่คือการแก้ไขการกำหนดค่าของคุณใน .bashrc หรือ .bash_profile และโหลดการเปลี่ยนแปลงใหม่โดยใช้ คำสั่งแหล่งที่มา .

$ type -a source
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

มีสองวิธีในการรัน 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
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

ตั้งค่าการอนุญาตสำหรับสคริปต์และเรียกสคริปต์หลัก “main.sh” . ตอนนี้สคริปต์นี้จะพยายามค้นหาฟังก์ชัน f1 และตัวแปร VAR1 ในสภาพแวดล้อมของเชลล์ปัจจุบันและจะล้มเหลวโดยไม่พบคำสั่ง

$ bash main.sh
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

ตอนนี้ ให้เรียกใช้คำสั่ง 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
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

เรียกใช้สคริปต์อีกครั้งแล้วดู

$ bash main.sh
เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

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

เพียงเท่านี้สำหรับบทความนี้ เราได้พูดคุยสั้น ๆ เกี่ยวกับความแตกต่างระหว่างการจัดหาและการฟอร์กในทุบตี อ่านบทความและแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา