สคริปต์ไม่ทำงานเมื่อถูกเรียกจากภายนอก


8

ฉันใช้สคริปต์ง่าย ๆ ในการสร้าง. mp3 จากไฟล์. mp4:

#!/bin/bash
for i in *.mp4
do
ffmpeg -i "$i" -ab 128k "${i%mp4}mp3"
done

สคริปต์ทำงานได้ดีเมื่อทำงานจากเดสก์ท็อปหรือเรียกผ่านเทอร์มินัล เมื่อสคริปต์ถูกเรียกใช้จากสคริปต์ภายนอกสคริปต์จะไม่สามารถเรียกใช้และส่งคืนได้

"* .mp4: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"

ฉันสงสัยว่าปัญหานี้เกิดจากการขยายตัวของเชลล์ แต่ไม่สามารถอธิบายวิธีแก้ไขได้ในสถานการณ์นี้

คำตอบ:


13

คุณกำลังใช้พา ธ สัมพัทธ์ซึ่งสคริปต์ของคุณกำลังค้นหา.mp4ไฟล์ในไดเรกทอรีปัจจุบันเช่นไดเรกทอรีที่สคริปต์กำลังทำงานอยู่และค้นหาว่าไม่มี.mp4ไฟล์ดังกล่าวอยู่แล้วจึงค้นหา*.mp4ไฟล์ตามตัวอักษร(สมมติว่าnullglob/ failglobไม่ใช่ ชุดซึ่งเป็นค่าเริ่มต้น) *.mp4: No Such File or Directoryและไฟล์ที่ไม่อยู่เกินไปจึงเกิดข้อผิดพลาด

คุณควรใช้พา ธ สัมบูรณ์แทน:

for i in /directory/*.mp4; do ...; done

แทนที่/directory/ด้วยเส้นทางไดเรกทอรีจริง ถ้าคุณต้องการคุณสามารถใช้ชื่อไดเรกทอรีเป็นอาร์กิวเมนต์แรกเช่นกัน:

for i in "$1"/*.mp4; do ...; done

คุณสามารถใช้เส้นทางสัมบูรณ์หรือเส้นทางสัมพัทธ์ที่นี่ แต่เส้นทางสัมบูรณ์อีกครั้งจะเป็นตัวเลือกที่ปลอดภัยกว่าเสมอ

ตอนนี้เรียกสคริปต์ที่ปฏิบัติการได้ตามปกติ:

/path/to/script.sh /directory

จากไดเรกทอรีสคริปต์:

./script.sh /directory

ขอบคุณสำหรับความช่วยเหลือ กำลังจะบอกคุณว่าฉันได้ลองใช้วิธีนี้ไม่สำเร็จ แต่แล้วสังเกตว่าฉันใช้อักษรตัวใหญ่ "H" ใน "/ home" เป็นครั้งแรก การผ่านของเส้นทางเป็นอาร์กิวเมนต์มีประโยชน์อย่างยิ่ง ไชโย
เอ็มสตรีท

โดยที่ "ข้อความแสดงข้อผิดพลาด" ที่จริงหมายถึง: เนื่องจากเชลล์ไม่สามารถจับคู่*.mp4กับไฟล์ใด ๆ จึงถือว่าเป็นชื่อไฟล์ตัวอักษรและพยายามเปิดไฟล์ที่เรียกว่า*.mp4(ซึ่งเป็นชื่อไฟล์ที่ถูกต้อง) และล้มเหลวเนื่องจากคุณไม่มีไฟล์ เรียกว่า*.mp4ในไดเรกทอรีปัจจุบัน บางคนอาจคิดว่า*.mp4จะขยายไปยังรายการของชื่อไฟล์ที่ตรงกันเสมอซึ่งอาจว่างเปล่า (และในกรณีนั้นforลูปจะไม่ทำอะไรเลย แต่จะไม่มีข้อผิดพลาดเกิดขึ้น) นี่ไม่ใช่กรณี: *.mp4ขยายเป็นบางสิ่งเสมอไป
Bakuriu

@Bakuriu ในกรณีนี้เป็นจริงในกรณีนี้ (หรือเป็นค่าเริ่มต้นbash) แต่ไม่เสมอไป ดูที่/nullglob failglob
heemayl

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