ถ้า script.sh เป็นอะไรที่เหมือน ๆ กัน
#!/bin/bash
echo "Hello World!"
มีวิธีที่ต้องการเรียกใช้สคริปต์หรือไม่ ฉันคิดว่าคุณต้อง chmod ก่อนดังนั้นมันจึงเป็นปฏิบัติการ?
ถ้า script.sh เป็นอะไรที่เหมือน ๆ กัน
#!/bin/bash
echo "Hello World!"
มีวิธีที่ต้องการเรียกใช้สคริปต์หรือไม่ ฉันคิดว่าคุณต้อง chmod ก่อนดังนั้นมันจึงเป็นปฏิบัติการ?
คำตอบ:
สำหรับสคริปต์เฉพาะของคุณจะใช้งานได้ยกเว้นว่า./script.sh
ต้องใช้บิตเรียกใช้และบิตที่อ่านได้ในขณะที่bash script.sh
ต้องการเพียงบิตที่อ่านได้
สาเหตุของความแตกต่างของข้อกำหนดการอนุญาตขึ้นอยู่กับว่าโปรแกรมที่แปลสคริปต์ของคุณโหลดแล้ว:
./script.sh
ทำให้เชลล์ของคุณเรียกใช้ไฟล์ราวกับว่ามันเป็นปฏิบัติการปกติเชลล์แยกตัวเองและใช้การเรียกของระบบ (เช่นexecve
) เพื่อให้ระบบปฏิบัติการเรียกใช้ไฟล์ในกระบวนการแยก ระบบปฏิบัติการจะตรวจสอบการอนุญาตของไฟล์ (ดังนั้นจำเป็นต้องตั้งค่าบิตการเรียกใช้งาน) และส่งต่อการร้องขอไปยังตัวโหลดโปรแกรมซึ่งดูที่ไฟล์และกำหนดวิธีดำเนินการ ในปฏิบัติการที่คอมไพล์ด้วย Linux เริ่มต้นด้วยหมายเลขมายากลของELFในขณะที่สคริปต์เริ่มต้นด้วย#!
( hashbang ) ส่วนหัว hashbang หมายความว่าไฟล์เป็นสคริปต์และจำเป็นต้องตีความโดยโปรแกรมที่ระบุไว้หลังจาก hashbang สิ่งนี้อนุญาตให้สคริปต์บอกระบบถึงวิธีการตีความสคริปต์
ด้วยสคริปต์ของคุณตัวโหลดโปรแกรมจะดำเนินการ/bin/bash
และส่งผ่าน./script.sh
เป็นอาร์กิวเมนต์บรรทัดคำสั่ง
bash script.sh
ทำให้เชลล์ของคุณทำงานbash
และผ่านscript.sh
เป็นอาร์กิวเมนต์บรรทัดคำสั่งดังนั้นระบบปฏิบัติการจะโหลดbash
(ไม่ได้ดูscript.sh
เพราะมันเป็นเพียงอาร์กิวเมนต์บรรทัดคำสั่ง) bash
กระบวนการที่สร้างขึ้นจะตีความว่าscript.sh
เพราะมันผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เนื่องจากscript.sh
มีการอ่านโดยbash
เป็นไฟล์ปกติเท่านั้นจึงไม่จำเป็นต้องใช้บิตการทำงาน
ฉันแนะนำให้ใช้./script.sh
เนื่องจากคุณอาจไม่ทราบว่าต้องใช้ตัวแปลภาษาใด ดังนั้นให้โหลดโปรแกรมกำหนดว่าสำหรับคุณ
. ./script.sh
ไม่เหมือนกับbash script.sh
(หรือ./script.sh
พิจารณาสคริปต์#!/usr/bin/python -V
<newline> print test
.
. script.sh
เพียงแค่พูดว่า แต่ฉันเห็นด้วยกับคนที่ไม่สนับสนุนการใช้.
คำสั่งในสคริปต์ที่ไม่ได้ตั้งใจจะเรียกใช้เช่นนั้น ฉันประหลาดใจที่ไม่มีใครพูดถึงว่าถ้าสคริปต์มีexit
คำสั่งและคุณก็มามันก็อาจจะนำคุณออกจากระบบ ปัญหาที่น่ากลัวน้อยกว่าคือถ้าสคริปต์ทำcd
เช่นนั้นจะส่งผลกระทบต่อเชลล์หลัก (แบบโต้ตอบ)
bash script.sh
เรียกใช้สคริปต์โดยตรงโดยใช้ bash
./script.sh
กำลังใช้ shebang #!/bin/bash
เพื่อกำหนดวิธีดำเนินการ
ถ้าคุณอยากรู้จริง ๆ ว่าไบนารีตัวไหนถูกเรียกใช้ถ้าคุณทำbash script.sh
คุณสามารถหาคำตอบwhich bash
ได้
ดังนั้นในตัวอย่างของคุณมันไม่ได้สร้างความแตกต่าง ใช่คุณต้องเพื่อให้สามารถดำเนินการได้โดยตรงผ่านทางchmod +x script.sh
./script.sh
/bin/bash
เป็นครั้งแรกในของคุณbash
$PATH
#!/bin/bash
เป็นเพียงการทำงานถ้ามี/bin/bash
./script.sh
ใช่บิตการดำเนินการเป็นสิ่งจำเป็นโดยเรียกผ่านเท่านั้น
สร้างไฟล์ Delete_Self.sh เช่นนี้:
#!/bin/rm
echo I am still here!
เรียกใช้สคริปต์นี้ตามที่sh Delete_Self.sh
คุณจะเห็น "ฉันยังอยู่ที่นี่!" สะท้อนกลับมา
ทำให้สามารถเรียกใช้งานได้และรันตามที่./Delete_Self.sh
คุณจะไม่เห็นสิ่งใดสะท้อนกลับในขณะที่ไฟล์Delete_Self.sh
นั้นหายไป
ดังนั้นความแตกต่างคือ:
bash script.sh
จะเพิกเฉย #! บรรทัดเนื่องจากมีการระบุ bash เป็นโปรแกรมเพื่อรัน script.sh./script.sh
จะอ่าน #! script.sh
สายการกำหนดโปรแกรมทำงานนอกเหนือจากคำตอบอื่น ๆ แล้วการรู้ถึงความแตกต่างระหว่างการเรียกใช้สคริปต์ผ่าน./script.sh
(i) และแหล่งที่มา./script.sh
(ii) นั้นมีประโยชน์ - รุ่น (i) จะสร้างเชลล์ใหม่ที่จะเรียกใช้คำสั่งในขณะที่ (ii) เรียกใช้คำสั่ง เปลือกปัจจุบัน - ซึ่งสามารถบังคับถ้าปฏิบัติการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมที่จำเป็นต้องเก็บรักษาไว้หลังจากออกจากปฏิบัติการ ตัวอย่างเช่นในการเปิดใช้งานสภาพแวดล้อมแบบหลามต้องใช้สิ่งต่อไปนี้:
source activate my_env
NB ทางเลือกอื่นsource
ที่คุณอาจพบคือใน.
ตัวเช่น
. activate my_env