[BASH] Variable ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
aLiEnTxC
Beiträge: 126
Registriert: 31.07.2004 20:06:04
Kontaktdaten:

[BASH] Variable ausführen

Beitrag von aLiEnTxC » 07.02.2005 15:35:26

Hallo Forum.

Ich bin gerade ein wenig am Scripten und würde gerne den Inhalt einer Variable ausführen.

Das sollte ja eigentlich kein Problem sein dachte ich mir... also habe ich es mit dem Befehl exec versucht. Das Problem ist aber nur das das Script nach der ausführung von exec beendet und nicht mehr weiter arbeitet..

Code: Alles auswählen

cat test.sh
#!/bin/sh

lala=`which mcedit`

#exec $lala /root/.bashrc

[ `$lala /root/.bashrc` ] && true

echo $lala

Mit dem zweiten Lösungsansatz bekomme ich nur folgende ausgabe...
subshell.c: couldn't get terminal settings: Invalid argument
... danach muss ich mit STRG+C das Script abbrechen...

Hat jemand eine Idee wie ich es anstellen kann, das er den Inhalt der Variable ausführt und vorallem nicht danach das Script abbricht?

Gruß,
Thomas

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 07.02.2005 15:43:30

dieses Script:

Code: Alles auswählen

#!/bin/sh
lala="echo hello world"
$lala
echo end of script
liefert folgende Ausgabe:

Code: Alles auswählen

$ ./x.sh
hello world
end of script

aLiEnTxC
Beiträge: 126
Registriert: 31.07.2004 20:06:04
Kontaktdaten:

Beitrag von aLiEnTxC » 07.02.2005 15:46:49

:oops: manchmal ist es so einfach das man den Wald vor lauter Bäumen nicht sieht *gg*

Danke!

obbel
Beiträge: 5
Registriert: 17.10.2010 14:00:15

Re: [BASH] Variable ausführen

Beitrag von obbel » 17.10.2010 14:11:15

Ich hab eigentlich das gleiche Problem… nur will es bei mir nicht so wirklich.

Ganz konkret habe ich folgendes vor:
Ich besitze eine Dreambox und kann mit VLC auf dem Rechner über mehrere m3u files mit Streamparametern zu den einzelnen TV Sendern fernsehen. Jetzt wäre es cool das auch auf dem iPhone schaun zu können. Wegen Datenmenge hab ich nun gegoogelt und gesehen, dass man VLC auch über das Terminal (von Mac OS X) ansprechen kann.
Das sieht dann in Beispiel Pro7 so aus:

Code: Alles auswählen

/Applications/_Multimedia/VLC.app/Contents/MacOS/VLC -I rc http://192.168.1.191:8001/1:0:1:445D:453:1:C00000:0:0:0: --sout='#transcode{vcodec=h264,vb=180,vfilter=canvas{width=480,height=320},acodec=mpga,ab=128}:standard{mux=ts,dst=,access=http}'
Das beinhaltet erst mal den Pfad zu VLC, dann den StreamPfad+Parameter für Pro7 und letztendlich den sout Parameter für das umcodieren / reduzieren der Datenmenge.

Alleine ausgeführt klappt das wunderbar.

Jetzt wollte ich den sout Parameter eigentlich gerne als Variable vorab definieren und verwenden.
Im ersten Schritt in der selben Pro7.command Datei. Später dann ausgelagert um es für alle anderen Sender auch verwende zu können.
Leider klappt das schon nicht.
Das sah so aus:

Code: Alles auswählen

#!/bin/sh
transVideo="vcodec=h264,vb=180,vfilter=canvas{width=480,height=320}"
echo $transVideo

transAudio="acodec=mpga,ab=128"
echo $transAudio

soutSetting="'#transcode{${transVideo},${transAudio}}:standard{mux=ts,dst=,access=http}'"
echo $soutSetting

execString="/Applications/_Multimedia/VLC.app/Contents/MacOS/VLC -I rc http://192.168.1.191:8001/1:0:1:445D:453:1:C00000:0:0:0: --sout=$soutSetting"

$execString

echo end of script
Es startet wohl was vom VLC Prozess aber er gibt mir fehler zurück.
Wenn ich mir $execString mit echo ausgebe und kopiere und ausführe gehts wieder ?!?
Warum nicht direkt?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: [BASH] Variable ausführen

Beitrag von gms » 17.10.2010 16:34:18

Willkommen im Forum!
obbel hat geschrieben: Wenn ich mir $execString mit echo ausgebe und kopiere und ausführe gehts wieder ?!?
bei diesem Vorgang ( echo-Ausgabe kopieren und ausführen ) wird das Kommando nochmals von der Shell eingelesen und interpretiert. Die Eingabezeile wird daher nochmals in einzelne Wörter zerlegt, eventuell werden Shell Variablen expandiert,... und Quotes werden entfernt.
Wenn ich nichts übersehen habe, dann sollte das neue Kommando in diesem Beispiel abgesehen von den Single-Quotes aber völlig ident sein. Dein Script müßte daher eigentlich funktionieren, wenn du diese Zeile ersetzt:

Code: Alles auswählen

soutSetting="#transcode{${transVideo},${transAudio}}:standard{mux=ts,dst=,access=http}"
Gruß
gms

Benutzeravatar
Meillo
Moderator
Beiträge: 9250
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [BASH] Variable ausführen

Beitrag von Meillo » 18.10.2010 20:39:34

Ich will eval(1) in diesem Zusammenhang erwaehnen, auch wenn es bei eben diesem Problem nicht relevant zu sein scheint. Folgendes ist dennoch gut zu wissen:
http://www.softpanorama.org/Utilities/eval.shtml hat geschrieben: If you enter any special characters, such as ; or |, eval expands them and the shell reprocesses the results before executing the command line. If you did not use the eval command, the CMD variable would not be interpreted correctly and certain commands would not run. Another example illustrates this concept.

Code: Alles auswählen

     # CMD='date | wc'
     # $CMD
     usage: date [-a sss.fff] [-u] [tformat] [mmddhhmm[yy]]
     # eval $CMD    
The first line sets CMD to a command containing a pipe. The second command trys to execute the variable CMD. The execution fails because the pipe is not expanded and is passed to date as an argument. Thus date complains about a bad argument. The third line expands CMD to date | wc. The shell executes the line as a proper command.
Use ed once in a while!

obbel
Beiträge: 5
Registriert: 17.10.2010 14:00:15

Re: [BASH] Variable ausführen

Beitrag von obbel » 20.10.2010 09:14:16

Sorry, hab die letzten zwei Tage keine Lust und Zeit mehr gehabt mir das nochmal anzuschaun.

Aber danke! Wenn ich die SingleQuotes weglasse, dann geht es.
Allerdings sind die bei dem echo vorher auch im Terminalfenster sichtbar gewesen. Daher kann ich das nicht ganz nachvollziehen.

obbel
Beiträge: 5
Registriert: 17.10.2010 14:00:15

Re: [BASH] Variable ausführen

Beitrag von obbel » 20.10.2010 17:36:51

ok, nun möchte ich eine StartStream.command Datei haben, die die Settings setzt und den Stream startet.

Diese soll dann von je einer Weiteren (pro Sender) geöffnet werden.
Diese selbst beinhaltet nur die URL zum Basisstream und den Aufruf der StartStream.command, die diese Basisstream URL samt Einstellungen zum neuen Stream macht.

Ich hab das mal so versucht:

Code: Alles auswählen

baseStreamUrl="http://192.168.1.191:8001/1:0:1:2EE3:441:1:C00000:0:0:0:"
sh "/Users/xy/.../.../StartStream.command"
und in der anderen dann erst mal zum Test:

Code: Alles auswählen

echo $baseStreamUrl
leider kommt das nicht an.
Wie muss ich das aufrufen, das es als Ganzes betrachtet wird oder ich einen eigenen Parameter übergeben kann oder gar eine "globale" Variable (zumindest für die beiden commad files sichtbare Variable)??

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: [BASH] Variable ausführen

Beitrag von gms » 20.10.2010 17:58:30

hier hilft ein Export der Variable ( dadurch wird diese Variable an alle aufgerufenen Kommandos weitervererbt )

Code: Alles auswählen

sirius ~ # cat x.sh
echo $X
sirius ~ # X="blabla"
sirius ~ # echo $X
blabla
sirius ~ # sh ./x.sh 

sirius ~ # export X
sirius ~ # sh ./x.sh 
blabla
sirius ~ # 
oder ein "sourcen" von StartStream.command ( dadurch wird das Script in der aufrufenden Shell ausgeführt ):

Code: Alles auswählen

sirius ~ # cat x.sh 
echo $X
sirius ~ # X="blabla"
sirius ~ # echo $X
blabla
sirius ~ # sh ./x.sh

sirius ~ # source ./x.sh
blabla
sirius ~ # 
Gruß
gms

obbel
Beiträge: 5
Registriert: 17.10.2010 14:00:15

Re: [BASH] Variable ausführen

Beitrag von obbel » 20.10.2010 17:59:53

möchte mir schnell selbst antworten:

statt

Code: Alles auswählen

sh "/Users/xy/.../.../StartStream.command"
muss man

Code: Alles auswählen

. "/Users/xy/.../.../StartStream.command"
schreiben.

Das wars schon… :)

obbel
Beiträge: 5
Registriert: 17.10.2010 14:00:15

Re: [BASH] Variable ausführen

Beitrag von obbel » 20.10.2010 18:01:42

jetzt war ich doch zu langsam :)

Danke, ich schau mir auch deine Lösung mal an.

Antworten