[gelöst] Shell - ich brauche hilfe

  • Ich glaub ich kriege das Quoting nicht gebacken, ganzen Abend gestern gessessen:



    Aufrufender Code:

    Code
    eval GEHT:
    eval /usr/bin/vdr -v $VIDEO_DIR -c $CFG_DIR -L $PLUGIN_DIR -r $REC_CMD
    -s $VDRSHUTDOWN -E $EPG_FILE -u $USER -g /tmp --port $SVDRP_PORT
    $OPTIONS $PLUGINS $REDIRECT
    
    
    exec GEHT NICHT:
    exec /usr/bin/vdr -v $VIDEO_DIR -c $CFG_DIR -L $PLUGIN_DIR -r $REC_CMD
    -s $VDRSHUTDOWN -E $EPG_FILE -u $USER -g /tmp --port $SVDRP_PORT
    $OPTIONS $PLUGINS $REDIRECT


    Geht nicht heisst: vdr meckert das er --logodir=/usr/share/vdr-xpmlogos nicht kennt, ergo scheint das quoting weg zu sein ? Benutze ich "$PLUGINS" erkennt er nicht das es mehrere Optionen sind.


    Ich muss aber mit vdr die ausführende Shell ersetzen ...


    Vielleicht hat von euch einer eine Idee ...

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

    Einmal editiert, zuletzt von steffen_b ()

  • Servus,


    wie wird denn der Inhalt der Variablen PLUGIN zugewiesen?
    Versuch mal bei der Zuweisung die einfachen Hochkommas zu nehmen:

    Code
    PLUGIN='-P "graphtft -d none" ...'


    Damit sollten die Anführungszeichen bei der Ausgabe noch dabei sein.


    cu
    Markus

  • ich hatte mal ein aehnliches Problem. Und habe es sinngemaess so geloest:


    Code
    PLUGS=$PLUGS\ -P\ \'graphtft\ -d\ none\'
    PLUGS=$PLUGS\ -P\ text2skin
    #PLUGS=$PLUGS\ -P\ iptv
    PLUGS=$PLUGS\ -P\ \'skinsoppalusikka\ --logodir=/usr/share/vdr-xpmlogos\'
    PLUGS=$PLUGS\ -P\ \'live\ -\ -port=8008\ --ip=0.0.0.0\'
    
    
    exec vdr $PLUGS


    hat den Vorteil man kann zeilenweise Kommentare einfuegen und so nach Belieben einzelne Plugins deaktivieren. Wichtig sind die 'escapes' vor den Spaces. Vielleicht nuetzt es hier...


    - sparkie

  • das problem ist das eval vom streamdev-server .... da zerhauts ihn mit dem "-".


    wetten ?

  • Nabend !


    Code
    # add the command line arguments for each plugin
    for plugin in ${ordered_plugins[@]}; do
        if [ -r "$PLUGIN_CFG_DIR/plugin.$plugin.conf" ] ; then
            arguments=( `cat $PLUGIN_CFG_DIR/plugin.$plugin.conf | sed "s/#.*$//"` )
            PLUGINS="$PLUGINS -P \"$plugin ${arguments[*]}\""
        else
            PLUGINS="$PLUGINS -P $plugin"
        fi
    done


    Also PLUGINS="$PLUGINS -P \"$plugin ${arguments[*]}\""


    Wenn ich echo "$PLUGINS" mache kommt oben angegebenes raus, ergo passt es da noch, mit eval (sprich zusammenfügen der Parameter und anschliessendes ausführen) läuft es auch,


    Hochkomma wird nichts, da dann das nacheinander zusammenfügen nicht ginge (Variablen würden nicht expanded).

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • nur mir zu liebe - entferne doch mal streamdev.


    bei mir erfolgt (im runvdr) das so:

    Code
    ...
        for p in `ProcessPlugins installed`; do
            option="-P$p"
            eval args=\${VDR_PLUGIN_ARGS_$p}
            if [ "$p" != "streamdev-server" ]; then
                [ -n "$args" ] && option="'${option} ${args}'"
            fi
            echo $option
        done
    ...


    das o.g. passiert in MakeArgs


    und wird über diese Zeile :

    Code
    eval /usr/local/bin/vdr -u vdr $VDR_BIN -E /nas/Video/vdr0/`uname -n`.data `MakeArgs`



    ausgeführt

  • Bei streamdev schlägt er ja garnicht fehl - sondern beim ersten Plugin was eine Option hat, wenn ich das entferne, das nächste etc pp.


    Mit eval wie bei dir gehts bei mir auch schon so - ich bräuchte aber exec ;)

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • ok - dann mach doch bitte mal aus dem exec ein echo und poste den output - es fängt an spannend zu werden.


    Frage warum exec und nicht :


    eval ....
    exit $?

  • Code
    /usr/bin/vdr -v /var/lib/video.00 -c /var/lib/vdr -L /usr/lib/vdr/plugins -r /usr/lib/vdr/vdr-recordingaction -s /usr/lib/vdr/vdr-shutdown.wrapper -E /var/cache/vdr/epg.data -u vdr -g /tmp --port 2001 -w 60 -P "graphtft -d none" -P text2skin -P iptv -P "suspendoutput " -P "skinsoppalusikka --logodir=/usr/share/vdr-xpmlogos" -P streamdev-server -P avolctl -P markad -P extrecmenu -P skinelchi -P quickepgsearch -P conflictcheckonly -P menuorg -P externalplayer -P channellists -P epgsearchonly -P "live --port=8008 --ip=0.0.0.0" -P wirbelscan -P "radio --files=/usr/share/vdr-plugin-radio --live=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-live.mpg --replay=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-replay.mpg --encrypted=0 --verbose=1" -P "xine -r" -P epgsearch -P femon


    Das Ding ist, ich habe ein Prozess der von aussen der den vdr beenden möchte, der kann aber nach der ganzen Skriptorgie nicht sehen, was der echte Prozess ist. Würde ich exec machen, was meines Erachtens nach gehen müsste, hätte vdr die PID des Skripts.


    Um das Kind beim Namen zu nennen. Was ich versuche, ist basierend auf e-tobi's Skripten, ein oder mehrere upstart Job(s) zu erstellen.

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • BTW:


    Code
    /usr/bin/vdr: unrecognized option '--logodir=/usr/share/vdr-xpmlogos"'


    Das ist der Fehler der da kommt. Wenn ich recht drüber nachdenke ist das " am Ende sehr strange ...


    Mal mit set -x ausgeführt:


    Code
    + LANG=de_DE.UTF-8
    + LC_ALL=de_DE.UTF-8
    + export LANG LC_ALL
    + exec /usr/bin/vdr -v /var/lib/video.00 -c /var/lib/vdr -L /usr/lib/vdr/plugins -r /usr/lib/vdr/vdr-recordingaction -s /usr/lib/vdr/vdr-shutdown.wrapper -E /var/cache/vdr/epg.data -u vdr -g /tmp --port 2001 -w 60 -P '"graphtft' -d 'none"' -P text2skin -P iptv -P '"suspendoutput' '"' -P '"skinsoppalusikka' '--logodir=/usr/share/vdr-xpmlogos"' -P streamdev-server -P avolctl -P markad -P extrecmenu -P skinelchi -P quickepgsearch -P conflictcheckonly -P menuorg -P externalplayer -P channellists -P epgsearchonly -P '"live' --port=8008 '--ip=0.0.0.0"' -P wirbelscan -P '"radio' --files=/usr/share/vdr-plugin-radio --live=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-live.mpg --replay=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-replay.mpg --encrypted=0 '--verbose=1"' -P '"xine' '-r"' -P epgsearch -P femon


    Woher kommen die ' ?

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • Sieht gut aus - quoting können wir meiner Meinung nach ausschließen - ich habs mal umgebrochen:



    was mir gerade noch einfällt - exec ist ein bash - built-in und/oder ein Kommando (wenn aus der sh ausgeführt) - das könnte dann noch einen Unterschied machen.


    Obs an exec oder vdr liegt könnten wir wie folgt rausbekommen (kannst du ein bischen C ?):


    args.c


    cc -o args args.c


    und dann ersetzt du in deiner Kommandozeile aus deinem letzten post vdr durch args und machst nochmal den exec drauf - dann schaun mer mal.

  • es ist das < "> an´m ende von suspendoutput ....


    ich hatte es vorhin schon unter verdacht - bitte gib mir recht ... entferne mal das Blank vor dem ".


    EDIT - hmm - so langsam wirds strange :


    das hier löppert beides (bei mir) :


    Code
    #! /bin/bash
    
    
    eval ./args -v /var/lib/video.00 -c /var/lib/vdr -L /usr/lib/vdr/plugins -r /usr/lib/vdr/vdr-recordingaction -s /usr/lib/vdr/vdr-shutdown.wrapper -E /var/cache/vdr/epg.data -u vdr -g /tmp --port 2001 -w 60 -P "graphtft -d none" -P text2skin -P iptv -P "suspendoutput " -P "skinsoppalusikka --logodir=/usr/share/vdr-xpmlogos" -P streamdev-server -P avolctl -P markad -P extrecmenu -P skinelchi -P quickepgsearch -P conflictcheckonly -P menuorg -P externalplayer -P channellists -P epgsearchonly -P "live --port=8008 --ip=0.0.0.0" -P wirbelscan -P "radio --files=/usr/share/vdr-plugin-radio --live=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-live.mpg --replay=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-replay.mpg --encrypted=0 --verbose=1" -P "xine -r" -P epgsearch -P femon
    
    
    exec ./args -v /var/lib/video.00 -c /var/lib/vdr -L /usr/lib/vdr/plugins -r /usr/lib/vdr/vdr-recordingaction -s /usr/lib/vdr/vdr-shutdown.wrapper -E /var/cache/vdr/epg.data -u vdr -g /tmp --port 2001 -w 60 -P "graphtft -d none" -P text2skin -P iptv -P "suspendoutput " -P "skinsoppalusikka --logodir=/usr/share/vdr-xpmlogos" -P streamdev-server -P avolctl -P markad -P extrecmenu -P skinelchi -P quickepgsearch -P conflictcheckonly -P menuorg -P externalplayer -P channellists -P epgsearchonly -P "live --port=8008 --ip=0.0.0.0" -P wirbelscan -P "radio --files=/usr/share/vdr-plugin-radio --live=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-live.mpg --replay=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-replay.mpg --encrypted=0 --verbose=1" -P "xine -r" -P epgsearch -P femon


    und liefert folgenden output :


    3 Mal editiert, zuletzt von magicamun ()

  • Zitat

    Originally posted by sparkie
    kannst du evtl. nicht ein ablauffaehiges (minimiertes) Script hier reinstellen, das den Fehler zeigt?
    Man kann sonst gar nicht mehr nachvollziehen, wie deine Scripten jetzt genau aussehen.


    - sparkie


    Danke sparkie. Garnicht so einfach - ich versuch mal eins zu erstellen heute abend. Erstmal Brötchen verdienen ;)


    magicamun: Danke !



    Und eval wie zu erwarten war:

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

    5 Mal editiert, zuletzt von steffen_b ()

  • Der versprochene Testcase, zeigt die selben Symptome:


    Bash
    #!/bin/bash
    
    
    PLUGINS=" -P \"graphtft -d none\" -P text2skin -P iptv -P \"suspendoutput \" -P \"skinsoppalusikka --logodir=/usr/share/vdr-xpmlogos\" -P streamdev-server -P avolctl -P markad -P extrecmenu -P skinelchi -P quickepgsearch -P conflictcheckonly -P menuorg -P externalplayer -P channellists -P epgsearchonly -P \"live --port=8008 --ip=0.0.0.0\" -P wirbelscan -P \"radio --files=/usr/share/vdr-plugin-radio --live=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-live.mpg --replay=/usr/share/vdr-plugin-radio/rtextUnten-kleo2-replay.mpg --encrypted=0 --verbose=1\" -P \"xine -r\" -P epgsearch -P femon  "
    
    
    
    
    exec /usr/local/bin/testargs $PLUGINS


    testargs ist das kleine C Programm zum testen von magicamun :)

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

    2 Mal editiert, zuletzt von steffen_b ()

  • Naja , du kannst es so machen :



    ..oder gleich mit screen ;)

  • screen hilft mir ja nicht, die plugins muss ich ja auch automatisch generieren, von daher hat das nicht geholfen. Ich bin aber heut morgen bei einem Kaffee auf eine Idee gekommen ... scheint zu funktionieren.


    Ich schmeiss die Plugins in ein Array:


    Und das exec heisst dann:
    exec /usr/local/bin/testargs "${PLUGINS[@]}"


    Für eval müsste ich PLUGINS[$PLUGNUM]="-P\"$plugin ${arguments[*]}\"" machen, für exec ists wie oben richtig.


    Juuhuu :D


    Danke an alle die geholfen haben.


    Der Testcase der's gebracht hat.

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

    Einmal editiert, zuletzt von steffen_b ()

  • Zitat

    Original von steffen_b
    screen hilft mir ja nicht, die plugins muss ich ja auc
    Der Testcase der's gebracht hat.


    Und sieht dazu auch noch gut aus, klasse!


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!