Ergebnis 1 bis 8 von 8

Thema: Mit echo Befehle in einer Zeile verknüpfen

  1. #1

    Mit echo Befehle in einer Zeile verknüpfen

    Hi,

    ich komm hier nicht weiter. Ich will Aufrufe für ffmpeg in ein Shell-Script speichern und das dann aufrufen. Ich will die Ausgabedatei nach ffmpeg noch umbenennen. Das Ergebnis soll so aussehen:

    Code (C):
    1. ffmpeg -i input -acodec mp3 output-temp ; mv output-temp output
    Wieso das mv? Ich will später noch einbauen, dass im Falle eines Abbruchs des Scriptes die unfertige Ausgabedatei gelöscht wird. Ich muss ja aber irgendwie fertige von unfertigen unterscheiden können. Da ich das ganze per For-Scleife mache sieht mein Script dafür so aus:

    Code (C):
    1. for file ; do
    2.  echo -n ffmpeg -i "$file" -acodec mp3 "$file"-temp >> /tmp/ffmpeg.sh ; echo mv "$file"-temp "$file"-new.mp3 >> /tmp/fmpeg.sh
    3. done
    Das fertige Shell-Script beinhaltet dann für jede MP3-Datei eine Zeile, jede Zeile besteht aus 1x ffmpeg und 1x mv. Wie ich im Falle eines Abbruchs des Scriptes das löschen umsetze weiß ich noch nicht, das kommt später. Aber irgendwie funktioniert das mit dem Shell-Script nicht. Das Ergebnis ist hier:

    Code (C):
    1. ffmpeg -i input -acodec mp3 output-tempmv output-temp output
    Es wird also das mv ohne Leerzeichen und ohne ; an ffmpeg gequetscht. Ich vermute er interpretiert hier das ; als Trennung für die beiden echo-Aufrufe. Wenn ich aber z. B. dazwischen ein

    Code (C):
    1. echo ";"
    einfüge, wird das komplett ignoriert.

  2. #2
    gesperrt
    Registriert seit
    Jul 2013
    Ort
    Berlin
    Beiträge
    383

    Re: Mit echo Befehle in einer Zeile verknüpfen

    Ich bin nicht sicher, was du erreichen willst. Vielleicht so was:

    Code (Bash):
    1. echo "\";" weiter mit Befehlen"\""

    Ausgabe:

    Code:
    "; weiter mit Befehlen"
    Geändert von LZ9900 (30.09.18 um 13:50 Uhr) Grund: Korrektur

  3. #3
    Mitglied

    (Threadstarter)


    Registriert seit
    Jan 2016
    Beiträge
    32

    Re: Mit echo Befehle in einer Zeile verknüpfen

    OK, das geht erstmal. Hier passiert dann aber etwas komisches. Ich lasse mir eine Dateiliste mit Kommando erstellen die ausgeführt werden sollen. Ich führe aber die Datei nicht direkt aus, sondern nutze eine while-Schleife um die einzelnen Kommandos auszulesen und zu starten. Die abgearbeitete Zeile wird gelöscht. Am Ende beginnt das ganze von vorne, falls die Datei leer ist bricht die Schleife ab. So kann ich auch Kommandos ausführen lassen die nachträglich in die Dateiliste kopiert wurden, als der ganze Prozess schon lief. Die While-Schleife sieht so aus:
    while true ; do
    count=$(cat command-list | wc -m )
    if [ "$count" -ge 1 ] ; then
    while read zeile; do
    $zeile
    sed -i '1,1 d' command-list
    done < command-list
    else
    break
    fi
    done
    So ein Kommando in der command-list kann z. B. so aussehen:

    ffmpeg -i input -acodec mp3 output-temp ; mv output-temp output
    Das Kommando funktioniert wenn ich es allein in einem Terminal starten würde und wenn ich die 'command-list' ausführbar mache und per ./command-list ausführe. Es geht aber nicht, wenn ich die command-list zeilenweise auslesen und die Kommandos starte mit o.g. While-Schleife. Da kommt die Fehlermeldung:

    Unable to find a suitable output format for ';'
    ;: Invalid argument
    Er scheint also && oder ; als Teil des FFmpeg-Aufrufs zu interpretieren und nicht als "Trenner" zwischen 2 separaten KOmmandos. Wieso passiert das aber nur wenn ich das ganze per While-Schleife ausführen lasse?

  4. #4
    Mitglied
    Registriert seit
    Jul 2013
    Ort
    /dev/null
    Beiträge
    2.256

    Re: Mit echo Befehle in einer Zeile verknüpfen

    Schreib mal, was du eigentlich erreichen willst. Und damit mein ich nicht die Codefragmente, sondern was die ursprüngliche Aufgabe ist.

    Ich denke, durch Deine Scripte baust du eine fragile Umgebung auf, die eigentlich so nicht sein müsste.

  5. #5

    Re: Mit echo Befehle in einer Zeile verknüpfen

    Das wirkt wirklich unnötig kompliziert. Wieso baust du erst eine Komamandoliste die du ausführst anstatt die Befehle direkt ausführen zu lassen?
    Du könntest nach jedem ffmpeg Befehl mittels if $? prüfen was der Rückgabewert der Funktion war und so Fehler direkt erkenne und löschen. Darüber hinaus stellt sich die Frage: Wenn du schon ein Script schreibst, wieso soll das alles aus one-linern bestehen? Du kannst auch Funktionen bilden welche als Übergabeparameter deine "command-list" Parameter beinhalten.


    Alles in allem wirkt der Ansatz wirr. Bitte einmal wie musv schrieb die genauen Anforderungen spezifizieren.

  6. #6
    Mitglied
    Registriert seit
    Jul 2013
    Ort
    /dev/null
    Beiträge
    2.256

    Re: Mit echo Befehle in einer Zeile verknüpfen

    Zitat Zitat von PLanB Beitrag anzeigen
    Du könntest nach jedem ffmpeg Befehl mittels if $? prüfen was der Rückgabewert der Funktion war und so Fehler direkt erkenne und löschen.
    Eigentlich würde wohl schon sowas reichen (ungetestet).

    Code (Bash):
    1.     for file ; do
    2.      echo -n ffmpeg -i "$file" -acodec mp3 "$file"-new.mp3 || rm "$file"-new.mp3
    3.     done
    4.  
    Dabei bin ich mir nicht mal sicher, ob ffmpeg das sogar nicht selbst löscht, falls es fehlschlägt.

  7. #7
    gesperrt
    Registriert seit
    Jul 2013
    Ort
    Berlin
    Beiträge
    383

    Re: Mit echo Befehle in einer Zeile verknüpfen

    Auf jeden Fall ist es empfehlenswert, den mp3-Encoder zu konfigurieren, z.B.:

    Code (Bash):
    1. ffmpeg -v error -i "Input" -c:a libmp3lame -q:a 0 "Output.mp3"
    https://trac.ffmpeg.org/wiki/Encode/MP3

  8. #8
    Mitglied
    Registriert seit
    Jul 2013
    Ort
    /dev/null
    Beiträge
    2.256

    Re: Mit echo Befehle in einer Zeile verknüpfen

    Ist korrekt. Und dann ist da natürlich noch die Frage, ob man mp3 überhaupt haben will. Aber das hängt vom Zielgerät ab.

    Ich bin vor ein paar Jahren mal auf Ogg gewechselt (verwendet u.a. Spotify). Mittlerweile verwende ich aber nur noch flac, da lossless.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •