# bash-scripting: externe Befehle mit " ausführen

## Christian99

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)

```

COMMAND="ffmpeg -i \"$infile\" [...] \"$outfile\""

```

und zum ausführen dann einfach nur

```

$COMMAND

```

leider funktioniert das nicht. ffmpeg interpretiert die " als mit zum dateinamen gehörig (anscheinend). Fehlermeldung: "test.mkv": No such file or directory

wenn ich 

```
echo $COMMAND
```

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

----------

## toralf

Tja, wenn es nur Leerzeichen sind, müßtest Du evtl. einfach die escapen mittels 

```
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.

----------

## Christian99

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 ' '?  :Wink: 

----------

## bell

Ich habe mir folgendes angewöhnt:

```
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.

----------

## Christian99

ok, danke, wenn man den befehl nicht von einer variable aus ausführt funktionierte es, wie es soll.

verstehen tu ich es aber nicht....

----------

## toralf

 *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 

```
COMMAND="ffmpeg ... ${infile} "
```

----------

## bell

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:

```
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

;)
```

----------

## Christian99

Ok, vielen Dank, eigentlich hätt ich das wissen müssen, aber wenn man nicht regelmäßig shell-skripte schreibt ...  :Wink: 

----------

