เมื่อฉันต้องการเรียกใช้.sh
ไฟล์ใน Terminal ฉันต้องวางไว้sh
ข้างหน้า
มีวิธีใดที่จะหลีกเลี่ยงปัญหานี้และทำให้ประหยัดการพิมพ์หรือไม่
เมื่อฉันต้องการเรียกใช้.sh
ไฟล์ใน Terminal ฉันต้องวางไว้sh
ข้างหน้า
มีวิธีใดที่จะหลีกเลี่ยงปัญหานี้และทำให้ประหยัดการพิมพ์หรือไม่
คำตอบ:
หากคุณใช้งานสคริปต์ของคุณจากเปลือกคุณไม่จำเป็นต้องมี#!/bin/sh
shebang ตามที่ระบุไว้ในคำตอบนี้ - ทุกระบบที่ใช้ Unix เหมือนที่ฉันเคยใช้รวมถึง OS X จะเป็นค่าเริ่มต้น/bin/sh
หากไม่มีล่ามเฉพาะเจาะจง ( แม้ว่าจะเป็นความคิดที่ดีเพราะไม่ใช่ผู้ใช้เชลล์จะไม่ทราบวิธีการเรียกใช้งานสคริปต์ของคุณเว้นแต่คุณจะให้เงินแก่ shebang)
คุณไม่จำเป็นต้องมี.sh
ส่วนขยาย คุณทำจำเป็นต้องตั้งค่าสิทธิ์ที่ปฏิบัติการเช่น
$ chmod +x script.sh
(นี่$
คือเชลล์พรอมต์ฉันใช้มันเพื่อแสดงคำสั่งที่คุณให้กับเชลล์เชิงโต้ตอบอย่าพิมพ์!)
แต่ผมคิดว่าสิ่งที่สับสนของคุณคือการที่คุณได้สร้างสคริปต์เช่นในไดเรกทอรีปัจจุบันและกำลังพยายามที่จะดำเนินการได้โดยเพียงแค่พิมพ์script.sh
script.sh
เช่น
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^D
หมายถึงcontrol- D. คุณจะพบสัญกรณ์นี้ในการเขียนจำนวนมากเกี่ยวกับการใช้ Unix)
ความจริงที่ว่าscript.sh
ในกรณีนี้คือเชลล์สคริปต์เป็นเพียงครึ่งหนึ่งของปัญหา ปัญหาที่แท้จริงของคุณคือโดยปกติเชลล์จะไม่ค้นหาไดเรกทอรีปัจจุบันของโปรแกรม อย่างไรก็ตามการทำงานนี้:
$ sh script.sh
hello, world
เพราะsh
ใช้สคริปต์เป็นอาร์กิวเมนต์
คุณสามารถเรียกใช้งานสคริปต์ - หรืออีกครั้งใด ๆ ที่รันได้ - ในไดเรกทอรีปัจจุบันหากมีการทำเครื่องหมายปฏิบัติการ (เช่นchmod +x
) โดยการระบุว่าคุณต้องการเรียกใช้หนึ่งในไดเรกทอรีปัจจุบัน:
$ ./script.sh
hello, world
PATH
นอกจากนี้คุณยังสามารถย้ายสคริปต์ไปยังไดเรกทอรีบน ฉันขอแนะนำให้/usr/local/bin
ใช้สิ่งนี้หากสคริปต์ของคุณตั้งใจจะใช้ทั่วทั้งระบบหรือbin
ไดเรกทอรีในบ้านของคุณหากสคริปต์นั้นเหมาะสำหรับคุณเท่านั้น สิ่งหลังต้องการให้คุณเพิ่ม$HOME/bin
ซึ่งขยายไปยังไดเรกทอรี bin ใหม่ของคุณPATH
โดยเพิ่มบรรทัดต่อไปนี้.profile
ในโฮมไดเร็กตอรี่ของคุณ:
PATH=$HOME/bin:$PATH
export PATH
ท้ายที่สุดคุณสามารถทำได้ถ้าคุณต้องการเพิ่มไดเรกทอรีปัจจุบันลงในของคุณPATH
ซึ่งจะช่วยให้คุณเพียงแค่ไปที่ไดเรกทอรีที่มีscript.sh
- หรือไฟล์ปฏิบัติการอื่น - และพิมพ์
$ script.sh
เพื่อรันมัน แต่ผมไม่แนะนำให้ปฏิบัตินี้เป็นผู้โจมตีในขณะนี้สามารถหลอกให้คุณทำงานปฏิบัติการโดยพลการโดยการวางสคริปต์ปฏิบัติการ (ชื่อการพูด, ls
) ลงในไดเรกทอรีคุณจะอยู่ใน. ถ้าคุณจริงๆต้องการที่จะทำ แต่ เพียงเพิ่มสิ่งต่อไปนี้ใน.profile
:
PATH=.:$PATH
export PATH
sl
หรือlls
หรือl
... คือความผิดพลาด เพียงแค่ปล่อยออกมาจาก.
$PATH
นอกจากนี้คุณอาจไม่ (หรือไม่ควร) จำเป็นต้องเชื่อใจทุกคนในระบบของคุณ ตัวอย่างเช่นสมมติว่ามีช่องโหว่บางอย่างที่ทำให้ผู้โจมตีสามารถวางไฟล์โดยพลการลงในไดเรกทอรีบางตัว แต่พวกเขาต้องการให้คุณเรียกใช้ไฟล์นั้นเพื่อเพิ่มระดับการใช้ประโยชน์ที่ดีขึ้น (เช่นรวบรวมข้อมูลและโทรศัพท์กลับบ้าน) การป้องกันในเชิงลึก!
/tmp
หรือไดเรกทอรีอื่น ๆ ที่เขียนได้ทั่วโลก
/tmp
et al. มาพร้อมกับดินแดน
คุณไม่จำเป็นต้องโทรsh
หากไฟล์สคริปต์ถูกทำเครื่องหมายว่าสามารถทำงานได้ ในกรณีนี้คุณสามารถเรียกมันว่าชื่อของฉันเหมือนกับที่คุณทำกับคำสั่งอื่นจากเชลล์ที่มีอยู่
เพื่อให้เหมาะสมอย่างสมบูรณ์คุณจะต้องทำสองสิ่ง:
แก้ไขสคริปต์ของคุณเพื่อรวมคำสั่งshebangที่ด้านบนของสคริปต์ของคุณ:
#!/bin/sh
... นั่นจะบอกเชลล์ว่าล่ามคนไหนที่ใช้ในการเรียกใช้สคริปต์ ในกรณีนี้การ/bin/sh
ปฏิบัติการ
ทำเครื่องหมายสคริปต์ว่าสามารถเรียกทำงานได้โดยคุณด้วยคำสั่งchmod :
chmod u+x scriptname.sh
เมื่อคุณทำทั้งสองอย่างนี้แล้วคุณควรจะสามารถเรียกใช้สคริปต์ของคุณโดยพิมพ์ชื่อไฟล์สคริปต์ของคุณในบรรทัดคำสั่ง คุณจะต้องอยู่ในไดเรกทอรีเดียวกันกับสคริปต์ของคุณจนกว่าคุณจะใช้ขั้นตอนที่เพิ่มขึ้นของการเพิ่มโฟลเดอร์ที่คุณมีตัวแปรเส้นทาง หากคุณไม่สนใจว่าเชลล์รันสคริปต์อะไรคุณไม่จำเป็นต้องระบุขั้นตอนที่หนึ่งsh
แต่มักจะดีกว่าที่จะแม่นยำและตั้งค่า "shebangsh"
/bin/sh
แม้ว่าพวกเขาจะไม่เจ็บ
ksh
สคริปต์จำนวนมากในสมัยของฉันใน HP-UX - แต่มันก็ดีที่ได้รู้ว่ามันไม่จำเป็นอย่างยิ่ง
exec
syscall คุณจะได้รับENOEXEC
ข้อผิดพลาด (รูปแบบ exec ) ขออภัยเกี่ยวกับสิ่งนั้น @bmike, @ ChrisW.Rea ฉันจะไปแก้ไขคำตอบของฉันตอนนี้