ข้อความแสดงข้อผิดพลาด 'แหล่งที่มา: ไม่พบ' เมื่อเรียกใช้สคริปต์


34

ฉันกำลังสร้างสคริปต์การตั้งค่าอัตโนมัติเล็กน้อยที่จะแก้ไข/etc/profileและ$HOME/.profileหากบางเส้นทางไม่ถูกส่งออก จากนั้นฉันต้องการโหลดซ้ำโดยอัตโนมัติ

ฉันได้อ่านสิ่งsourceนี้แล้วฉันก็เลยเทอร์มินัลของฉันแล้วเข้า:

source /etc/profile
source ~/.profile

จากเทอร์มินัลจะไม่แสดงข้อผิดพลาดใด ๆ

source: not foundอย่างไรก็ตามการวางสองคำสั่งเหล่านี้ภายในผลสคริปต์ทุบตีใน

  1. ฉันจะแน่ใจได้อย่างไรว่าสคริปต์นั้นถูกใช้งานโดย Bash แม้ว่า#!/bin/shจะมีการระบุไว้ (เห็นได้ชัดว่ามันไม่ได้รับประกัน)
  2. ทำไมถึงบอกว่าไม่พบแหล่งที่มาทั้งสองนี้เมื่ออยู่ที่นั่นอย่างแน่แท้

คำตอบ:


53

/bin/shbashไม่ใช่ เพื่อรันสคริปต์ของคุณด้วยbashเขียน#!/bin/bashเป็นบรรทัดแรกในสคริปต์ของคุณ

ข้อผิดพลาดsource: not foundจะไม่ลดลงเพราะ/etc/profileไม่พบ มันลดลงเพราะsourceไม่พบ เป็นทุบตีในตัวฟังก์ชั่นและคุณไม่ได้รันสคริปต์ด้วยsource bashชัดเจนว่าทำไมถึงไม่พบ เปลี่ยน#!บรรทัดในสคริปต์และมันจะทำงาน


9

1. ฉันจะแน่ใจได้อย่างไรว่าสคริปต์นั้นถูกดำเนินการโดย Bash แม้ว่า #!/bin/shจะมีการระบุไว้ (เห็นได้ชัดว่ามันไม่ได้รับประกัน)

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

bash script_name

ดังนั้นคุณจะไม่ได้รับข้อผิดพลาดนั้นอีกต่อไป

2. ทำไมจึงบอกว่าไม่พบแหล่งที่มาทั้งสองนี้เมื่ออยู่ที่นั่นอย่างไม่ผิดเพี้ยน

ไม่ได้บอกว่าไฟล์ที่มานั้นไม่ได้อยู่ที่นั่น มันบอกว่าsourceไม่พบคำสั่ง นี่เป็นเรื่องปกติเนื่องจากเมื่อคุณเริ่มต้นสคริปต์ด้วย#!/bin/shบรรทัดสคริปต์ของคุณจะทำงานโดยshไม่ใช้bashอย่างที่คุณคิด ทำไมมันเป็นเรื่องปกติ เพราะsourceคำสั่งคือ Bash builtin แต่ไม่ใช่shBuildin หากต้องการแหล่งไฟล์ในshคุณควรใช้.(จุด) ตัวอย่าง:

. /etc/profile
. ~/.profile

อีกวิธีหนึ่งคือการเปลี่ยนสาย shebang ที่จะ#!/bin/bashเป็นความวุ่นวายกล่าวในคำตอบของเขา


4

ดูคำถาม SOนี้:

/bin/shมักจะเป็นเปลือกอื่น ๆ ที่พยายามเลียนแบบ The Shell การกระจายจำนวนมากใช้/bin/bashสำหรับshมันรองรับแหล่งที่มา บน Ubuntu /bin/dashนั้นใช้งาน แต่ไม่รองรับแหล่งที่มา หากคุณไม่สามารถแก้ไขสคริปต์ได้ให้ลองเปลี่ยนเชลล์ที่รันอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.