Script non funzionante quando chiamato esternamente


8

Uso un semplice script per creare .mp3s da file .mp4:

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

Lo script funziona correttamente quando viene eseguito dal desktop o chiamato tramite il terminale. Quando lo script viene chiamato da uno script esterno, tuttavia, non viene eseguito, tornando

"* .mp4: nessun file o directory del genere".

Sospetto che il problema sia con l'espansione della shell, ma non riesco a capire come risolverlo in questa situazione.

Risposte:


13

Stai utilizzando un percorso relativo, in cui lo script sta cercando i .mp4file nella directory corrente, ovvero la directory da cui viene eseguito lo script, e scoprendo che non .mp4esiste tale file, quindi cerca un *.mp4file letterale (supponendo nullglob/ failglobno set, che è l'impostazione predefinita) e anche quel file non esiste, da cui il messaggio di errore *.mp4: No Such File or Directory.

Dovresti usare invece il percorso assoluto:

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

Sostituisci /directory/con il percorso effettivo della directory; se vuoi puoi prendere anche il nome della directory come primo argomento:

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

È possibile utilizzare il percorso assoluto o relativo qui, ma di nuovo il percorso assoluto è sempre l'opzione più sicura.

Ora chiama lo script eseguibile nel solito modo:

/path/to/script.sh /directory

Dalla directory dello script:

./script.sh /directory

Grazie per l'aiuto. Stavo per dirti che l'avevo già provato senza successo, ma poi ho notato che avevo messo in maiuscolo la "H" in "/ home" per la prima volta. Il passaggio del percorso come argomento è stato particolarmente utile. Saluti.
M. Street,

Dove "da qui il messaggio di errore" significa in realtà: poiché la shell non è in grado di abbinarsi *.mp4a nessun file, lo considera come un nome di file letterale e tenta di aprire il file chiamato *.mp4(che è un nome di file valido) e fallisce perché non hai alcun file chiamato *.mp4nella directory corrente. Qualcuno potrebbe pensare che *.mp4si espanda sempre all'elenco dei nomi di file corrispondenti, che potrebbe essere vuoto (e in tal caso il forciclo non farebbe nulla, ma non verrebbero generati errori), non è così: *.mp4si espande sempre in qualcosa.
Bakuriu,

@Bakuriu Mentre questo è vero in questo caso (o predefinito in bash) ma non sempre; guarda nullglob/ failglob.
Hememl

Se avessi sbagliato pensavo che '*' fosse solo per il nome file, piuttosto che la combinazione di percorso E nome file. vivi e impara :)
M. Street,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.