[gelöst] bash-Rätsel: Syntax richtig & falsch zugleich

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

[gelöst] bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von MartinV » 29.07.2016 16:38:33

Hallo!

Ich stehe vor einem Rätsel. Ich fülle mehrere Variablen mit Befehlsbruchstücken, die am Ende einen Befehl als Ganzes ergeben sollen.

Kurzgefaßt:

Code: Alles auswählen

 
  GPHOTO2="gphoto2 --capture-movie=3600s --stdout "
  FFMPEG=" | ffmpeg -i - -f mpegts udp://localhost:8040 -loglevel warning "
  TEE=""
  SAVEONLY=""

  # Der Befehl
  $GPHOTO2 $TEE $SAVEONLY $FFMPEG &  

  # Befehl im Terminal anzeigen
  echo   $GPHOTO2 $TEE $SAVEONLY $FFMPEG '&'
Führe ich das Skript aus, zeigt gphoto2 mir seine Optionen wie beim Aufruf von --help. Das macht es immer, wenn falsche/fehlerhafte Optionen übergeben werden. ffmpeg wird nicht gestartet.
echo gibt aus:

Code: Alles auswählen

gphoto2 --capture-movie=3600s --stdout | ffmpeg -i - -f mpegts udp://localhost:8040 -loglevel warning &
Kopiere ich die Ausgabe von echo und führe sie in bash direkt aus, funktioniert alles, wie es soll. gphoto2 nimmt ein Video auf, die pipe leitet es weiter an ffmpeg, das das Video als Stream an Port 8040 schickt.
Versuchsweise habe ich " durch ' ersetzt, kein Unterschied.

Kann mir jemand auf die Sprünge helfen?

Viele Grüße, Martin

Edit:
Das geht nicht:

Code: Alles auswählen

$GPHOTO2 $FFMPEG
Das geht, pipe | aus $FFMPEG entfernt und direkt eingefügt:

Code: Alles auswählen

  GPHOTO2="gphoto2 --capture-movie=3600s --stdout "
  FFMPEG=" ffmpeg -i - -f mpegts udp://localhost:8040 -loglevel warning "
  $GPHOTO2 | $FFMPEG
Es scheint, als ob das pipe-Zeichen | in $FFMPEG irgendwie verschluckt wird. Aber echo zeigt es doch an !? :?: Aber das hier (pipe in $FFMPEG und im Aufruf) geht trotzdem nicht, dann kommt Fehlermeldung "Zeile 69: |: Kommando nicht gefunden.":

Code: Alles auswählen

  GPHOTO2="gphoto2 --capture-movie=3600s --stdout "
  FFMPEG=" | ffmpeg -i - -f mpegts udp://localhost:8040 -loglevel warning "
  $GPHOTO2 | $FFMPEG
Zuletzt geändert von MartinV am 29.07.2016 19:24:00, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von rendegast » 29.07.2016 18:51:34

Ist doch eigentlich einfach.
Durch Verpacken in eine Variable verliert '|' seinen Sonderstatus als Funktion der Shell und wird zu einem normalen Zeichen.
"Zeile 69: |: Kommando nicht gefunden.":
Das zweite "|" wird als Name einer Funktion/Alias/Programm interpretiert,
der Beginn eines neuen Befehls.
Da sowas in dem Fall nicht existiert gibt es einen Fehler.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von MartinV » 29.07.2016 19:02:53

Durch Verpacken in eine Variable verliert '|' seinen Sonderstatus als Funktion der Shell und wird zu einem normalen Zeichen.
oh ...
Das kann ich soweit verstehen.
Es widerspricht nur meinem Verständnis, wie die bash funktionieren soll.
Ich hatte es so verstanden, daß erst alle $FOO durch ihren Inhalt ersetzt werden. Erst danach wird der Befehl als ganzes interpretiert. Ist wohl doch nicht so.

Kann ich das irgendwie ändern oder tricksen? Oder muß ich meinen schönen Einzeiler zerstören und für jede Kombination der Bestandteile einen eigenen Befehl schreiben?

Danke!
Martin
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von Phineas » 29.07.2016 19:13:22

Code: Alles auswählen

bash -c "$GPHOTO2 $TEE $SAVEONLY $FFMPEG"

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von MartinV » 29.07.2016 19:21:05

Phineas hat geschrieben:

Code: Alles auswählen

bash -c "$GPHOTO2 $TEE $SAVEONLY $FFMPEG"
Hey, das geht! Danke!
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: [gelöst] bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von Phineas » 29.07.2016 20:04:52

Bitte. Mit eval wird man das auch zusammen fummeln können. Wirklich schön ist Beides nicht, aber da kommst Du selbst drauf, falls das Skript noch erweitert wird.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: [gelöst] bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von MartinV » 29.07.2016 20:46:39

Mit eval wird man das auch zusammen fummeln können. Wirklich schön ist Beides nicht
Ja, bei beiden Lösungen mangelt es an gewisser Eleganz. Doch durch rendegast habe ich jetzt das Problem verstanden, und habe von Dir eine mögliche Lösung.

Für das aktuelle Projekt habe ich jetzt einen Zwischenweg gewählt, die schlimmsten sich wiederholenden Befehlsbrocken sind in Variablen, der Rest wird in einer case-Abfrage zusammengesetzt. Ist insgesamt sogar etwas übersichtlicher / nachvollziehbarer geworden.

Das gleiche Problem wird wohl auch für andere Operatoren wie < und > zutreffen, wahrscheinlich auch [...]. [...] kann man durch test ersetzen. Gibt es für die anderen Operatoren auch Wortbefehle? Ich habe erst einmal nichts finden können.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: [gelöst] bash-Rätsel: Syntax richtig & falsch zugleich

Beitrag von Phineas » 30.07.2016 10:52:03

Ich sehe da keine große Probleme. Vielleicht mal 'n Backslash verteilen, warten wir lieber auf Konkretes.

Antworten