View previous topic :: View next topic |
Author |
Message |
Christian99 Veteran
Joined: 28 May 2009 Posts: 1681
|
Posted: Wed Dec 12, 2012 7:11 pm Post subject: bash-scripting: externe Befehle mit " ausführen |
|
|
Hi, ich versuch gerade einen wrapper für ffmpeg zu bauen, der mir Tipparbeit sparen soll. ich hab nur ein kleines Problem:
Ich möchte die übergebenen Dateinamen in "" setzen, damit diese auch Leerzeichen enthalten können.
ich baue mir den Befehl so zusammen (ffmpeg-optionen rausgekürzt)
Code: |
COMMAND="ffmpeg -i \"$infile\" [...] \"$outfile\""
|
und zum ausführen dann einfach nur
leider funktioniert das nicht. ffmpeg interpretiert die " als mit zum dateinamen gehörig (anscheinend). Fehlermeldung: "test.mkv": No such file or directory
wenn ich
mache und die Ausgabe kopiere und Einfüge und asuführe, dann funktioniert es.
wie muss ich jetzt die Anführungszeichen und wo escapen, oder was auch immer ich machen muss?
Schönen Dank
Christian |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3925 Location: Hamburg
|
Posted: Wed Dec 12, 2012 7:50 pm Post subject: |
|
|
Tja, wenn es nur Leerzeichen sind, müßtest Du evtl. einfach die escapen mittels Code: | echo "mi au" | sed 's/ /\\ /g' | , aber diese Befehlssequenze bei Deiner Lösung einzubauen läöuft auch auf die backslash/Escape-Hölle hinaus, fürchte ich. |
|
Back to top |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1681
|
Posted: Wed Dec 12, 2012 8:00 pm Post subject: |
|
|
hm, wäre eine Möglichkeit, find ich aber unschön (nicht bös gemeint) weil das ja nur für Leerzeichen geht bzw ich bei allen anderen zeichen die escaped werden müssen das einzeln machen muss.
PS: sollte das nicht nur ein \ sein innerhalb von ' '? |
|
Back to top |
|
|
bell Guru
Joined: 27 Nov 2007 Posts: 510
|
Posted: Wed Dec 12, 2012 8:13 pm Post subject: |
|
|
Ich habe mir folgendes angewöhnt:
Code: | function do_ffmpeg(){
infile="$1"
outfile="$2"
ffmpeg -i "$infile" [...] "$outfile"
}
do_ffmpeg inpputfile.avi outputfile.mpg |
Damit umgeht man das Problem und der Code ist lesbarer. |
|
Back to top |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1681
|
Posted: Wed Dec 12, 2012 8:44 pm Post subject: |
|
|
ok, danke, wenn man den befehl nicht von einer variable aus ausführt funktionierte es, wie es soll.
verstehen tu ich es aber nicht.... |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3925 Location: Hamburg
|
Posted: Wed Dec 12, 2012 9:13 pm Post subject: |
|
|
Christian99 wrote: | PS: sollte das nicht nur ein \ sein innerhalb von ' '? | Nein, der Ausdruck ist schon korrekt so.
Wie jedoch schon bemerkt, es geht halt im dargestellten Beispiel nur für Leerzeichen.
Was ich mich jedoch frage, ist, ob geschweifte Klammern Dir helfen könnten, also etwas in der Art Code: | COMMAND="ffmpeg ... ${infile} " |
|
|
Back to top |
|
|
bell Guru
Joined: 27 Nov 2007 Posts: 510
|
Posted: Wed Dec 12, 2012 9:54 pm Post subject: |
|
|
Das Problem ist nicht die Maskierung, sondern die anschließende Interpretation. Wenn Du dann $COMMAND ausführst, interpretiert die Shell die Zeichenkette nicht mehr. Die " werden also nicht mehr entfernt und er findet keine Datei die mit " beginnt und endet. Die Lösung ist "eval".
Beispiel:
Code: | COMMAND="ls \"$HOME\""
echo $COMMAND
ls "/home/meinuser"
###soweit sogut
$COMMAND
ls: Zugriff auf "/home/meinuser" nicht möglich: Datei oder Verzeichnis nicht gefunden
### Klar, mit " gibt es auch nicht.
eval $COMMAND
;) |
|
|
Back to top |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1681
|
Posted: Fri Dec 14, 2012 2:45 pm Post subject: |
|
|
Ok, vielen Dank, eigentlich hätt ich das wissen müssen, aber wenn man nicht regelmäßig shell-skripte schreibt ... |
|
Back to top |
|
|
|