Script tidak berfungsi ketika dipanggil secara eksternal

8

Saya menggunakan skrip sederhana untuk membuat .mp3s dari file .mp4:

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

Script berjalan dengan baik ketika dijalankan dari desktop atau dipanggil melalui terminal. Namun ketika skrip dipanggil dari skrip eksternal, skrip tersebut gagal dijalankan, kembali

"* .mp4: Tidak Ada File atau Direktori Seperti Itu".

Saya menduga masalahnya adalah dengan ekspansi shell, tetapi tidak bisa membungkus kepala saya bagaimana memperbaikinya dalam situasi ini.

M. Street
sumber

Jawaban:

13

Anda menggunakan jalur relatif, di mana skrip Anda mencari .mp4file di direktori saat ini yaitu direktori dari mana skrip sedang dijalankan, dan menemukan bahwa tidak .mp4ada file seperti itu, maka ia mencari *.mp4file literal (dengan asumsi nullglob/ failglobtidak set, yang merupakan default), dan file itu tidak ada juga, karenanya pesan kesalahan *.mp4: No Such File or Directory.

Anda harus menggunakan jalur absolut sebagai gantinya:

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

Ganti /directory/dengan jalur direktori aktual; jika mau, Anda juga dapat menggunakan nama direktori sebagai argumen pertama:

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

Anda dapat menggunakan jalur absolut atau relatif di sini, tetapi sekali lagi jalur absolut selalu merupakan opsi yang lebih aman.

Sekarang panggil skrip yang dapat dieksekusi dengan cara biasa:

/path/to/script.sh /directory

Dari direktori skrip:

./script.sh /directory
heemayl
sumber
Terima kasih untuk bantuannya. Akan memberitahumu bahwa aku sudah mencoba itu tidak berhasil, tetapi kemudian menyadari bahwa aku menggunakan huruf kapital "H" di "/ rumah" pertama kali. Melewati jalan sebagai argumen sangat berguna. Bersulang.
M. Street
Di mana "maka pesan kesalahan" sebenarnya berarti: karena shell tidak dapat mencocokkan *.mp4dengan file apa pun itu menganggapnya sebagai nama file literal dan mencoba untuk membuka file yang disebut *.mp4(yang merupakan nama file yang valid) dan gagal karena Anda tidak memiliki file dipanggil *.mp4dalam direktori saat ini. Seseorang dapat berpikir bahwa *.mp4selalu memperluas ke daftar nama file yang cocok, yang bisa kosong (dan dalam hal ini forloop tidak akan melakukan apa-apa, tetapi tidak ada kesalahan akan dinaikkan), ini tidak terjadi: *.mp4selalu berkembang menjadi sesuatu.
Bakuriu
@ Bakuriu Padahal ini benar dalam kasus ini (atau default dalam bash) tetapi tidak selalu; lihat nullglob/ failglob.
heemayl
Apakah saya salah berpikir bahwa '*' hanya untuk nama file, bukan kombinasi path DAN nama file. hidup dan belajar :)
M. Street