Quoting / Escaping Problem

  • Hi...


    ich hätte gerne eine runvdr.sh, der ich die Plugins und Optionen für vdr über Variablen mittteilen kann.
    Das funktioniert soweit auch ganz, bis es an die Plugins geht, deren Befehl "geteilt" ist, sprich ein Leerzeichen beinhaltet.
    Bestes Beispiel ist mplayer mit der Option für die mplayer.sh.


    Schaut mein Script so aus:



    ... dann gibt' folgende Ausgabe:



    Soweit versteh' ich das ja auch noch...


    änder ich das ganze allerdings in die Richtung


    Code
    [...]
    OPTIONS[4]="-P 'mplayer -M /usr/local/bin/mplayer.sh'"
    [...]


    dann passiert das hier:



    Da steh ich vor nem Rätsel... Wie bring ich das Ding dazu, die Hochkommata einfach zu übernehmen, und den passenden AUfruf zu machen?
    Weiss da jemand weiter?


    Solemn

    Client: Silverstone LaScala LC17 -- MSI 945PL Neo3 -- Core2 Duo E4400 -- 2GB RAM -- Zotac GeForce GT 220 Zone Edition -- Harmony 650 -- OpenELEC 3.0.6
    Server: Gigabyte 970A-UD3 -- AMD Phenom II X4 955 -- 6GB RAM -- TT1600-S2 -- DVBSKy S952 Dual DVB-S/S2

    VG system: md-raid 2x160GB RAID1

    VG data: md-raid 6x1TB RAID5

    Ubuntu Server 13.04 -- yaVDR unstable -- xvdr

  • [quote]Original von Solemn
    Aus

    Code
    OPTIONS[4]="-P 'mplayer -M /usr/local/bin/mplayer.sh'"

    Mach er also

    Code
    OPTIONS[4]='-P '\''mplayer -M /usr/local/bin/mplayer.sh'\'''


    Gerade bei solchen Sachen muß ich auch immer probieren. Also teste dochmal die folgenden Varianten:

    Code
    OPTIONS[4]="-P \"mplayer -M /usr/local/bin/mplayer.sh\""


    Allerdings vermute ich, daß Du hiermit weiter kommst:

    Code
    OPTIONS[4]="-P \\\"mplayer -M /usr/local/bin/mplayer.sh\\\""


    Versuch's auch mal mit "nur" zwei "\".

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Ein Array ist ja schon mal der richtige Ansatz um das leidige Quotingproblem zu umgehen, aber Du hast es nicht konsequent durchgezogen ...


    Beim Setzen von VDRCMD wird durch die fehlenden Anführungszeichen doch wieder an Leerstellen getrennt. Eventuell reicht es schon, wenn Du dort "${OPTIONS[@]}" schreibst, also so:


    Code
    VDRCMD=($VDRPRG $VDRUSR $WATCHDOG_TIME $CONF_DIR $EPG_DIR $VIDEO_DIR $PLUGIN_DIR $LOG_LEVEL $CONSOLE "${OPTIONS[@]}")


    Ansonsten setze mal jede einzelne Variable von VDRCMD in "", da bin ich mir jetzt aber nicht sicher, ob VDR z.B. "-u root" als einen Parameter akzeptiert oder ob es zwei ("-u" "root") sein müssen.


    [EDIT] Nachtrag:


    Meine "neueste" Version, solche Arrays zu erstellen, sieht übrigens so aus:



    Also eine kleine Hilfsfunktion, die ihre Parameter an das Array anhängt. Erspart das doppelte Quoting und man hat trotzdem alle zusammengehörigen Parameter in einer Zeile.

  • you made my day!


    Deine add_args() funktioniert....


    Ich versteh zwar noch net genau warum das damit läuft, die ' fehlen ja dann in der Zeile, aber es geht...


    Trotzdem, gleich mal ein O'Reilly-Buch bestellt, so kann das ja net weitergehen ;)


    thx
    Solemn

    Client: Silverstone LaScala LC17 -- MSI 945PL Neo3 -- Core2 Duo E4400 -- 2GB RAM -- Zotac GeForce GT 220 Zone Edition -- Harmony 650 -- OpenELEC 3.0.6
    Server: Gigabyte 970A-UD3 -- AMD Phenom II X4 955 -- 6GB RAM -- TT1600-S2 -- DVBSKy S952 Dual DVB-S/S2

    VG system: md-raid 2x160GB RAID1

    VG data: md-raid 6x1TB RAID5

    Ubuntu Server 13.04 -- yaVDR unstable -- xvdr

  • Ist zwar nicht ganz zu dem Problem aber zu dem Titel passt es.
    Ich suche eine Möglichkeit in einem Shell Script aus einem String:


    "Hallo Welt"
    folgendes zu machen
    "Hallo\ Welt"


    Also aus "die ist ein string" -> "die\ ist\ ein\ string"


    Das Problem ist nur das nicht nur Spaces gequoted werden sollen, sondern auch alles anderen was man in einer Shell quoten muss.


    Im Grunde so was wie ein autoquote.


    Kennt jemand da was oder muss man das selber machen?

  • Zitat

    Original von decembersoul
    Also aus "die ist ein string" -> "die\ ist\ ein\ string"


    sed?


    Zitat

    Im Grunde so was wie ein autoquote.


    Evtl. hilft Dir die IFS Variable weiter?

    Code
    IFS="
    "
    ...


    Dann wirde als Parametertrenner, Varablentrenner etc. ein richtiges Enter gewertet. Evtl. brauchst Du dann garnicht mehr umstaendlich escapen.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Originally posted by decembersoul
    Im Grunde so was wie ein autoquote.


    Kennt jemand da was oder muss man das selber machen?


    nehme vllt. das mal als Grundlage (File heisst unten 'quote')


    z.B.

    Code
    # echo 'dies ist ein test*hsh(tst)\' | quote
    dies\ ist\ ein\ test\*hsh\(tst\)\
  • ja so was habe ich gesucht.
    Muss man also doch alles selber machen.
    Ich dachte das es so was vielleicht schon gibt.
    Danke

  • Zitat

    Original von Solemn
    ich hätte gerne eine runvdr.sh, der ich die Plugins und Optionen für vdr über Variablen mittteilen kann.


    Ich würde sogar noch einen Schritt weiter gehen und das ganze als XML hinterlegen allerdings reicht hier ein Shellscript ned mehr aus dann brauchst schon Ruby oder ne ähnliche Scriptsprache. Das bringt mich auf eine Idee für meinen neuen VDR der derzeit in Planung ist da wollt ich eh einiges mit Ruby machen vielleicht setz ich diese Idee auch um, das hätte einige Vorteile das man zb. Startparameter und Plugins per Webfrontend konfigurieren könnte etc.

  • Zitat

    Original von Scogit



    Ich würde sogar noch einen Schritt weiter gehen und das ganze als XML hinterlegen allerdings reicht hier ein Shellscript ned mehr aus dann brauchst schon Ruby oder ne ähnliche Scriptsprache.



    Hmmm.... in meinem morgendlichen Leichtsinn.... würde Shell zum XML_parsen nicht reichen? Habe zugegebenermaßen nur sehr rudimentäre Kenntnisse von XML, aber prinzipiell sollte das doch gehen, oder? Über die Perfomance möcht ich net reden... :)


    Solemn

    Client: Silverstone LaScala LC17 -- MSI 945PL Neo3 -- Core2 Duo E4400 -- 2GB RAM -- Zotac GeForce GT 220 Zone Edition -- Harmony 650 -- OpenELEC 3.0.6
    Server: Gigabyte 970A-UD3 -- AMD Phenom II X4 955 -- 6GB RAM -- TT1600-S2 -- DVBSKy S952 Dual DVB-S/S2

    VG system: md-raid 2x160GB RAID1

    VG data: md-raid 6x1TB RAID5

    Ubuntu Server 13.04 -- yaVDR unstable -- xvdr


  • Ungetest :schiel


    Code
    - $VIDEO_DIR $PLUGIN_DIR $LOG_LEVEL $CONSOLE ${OPTIONS[@]}
            "${VDRCMD[@]}"
    + eval $VIDEO_DIR $PLUGIN_DIR $LOG_LEVEL $CONSOLE ${OPTIONS[@]}
            "${VDRCMD[@]}"


    LG Ronny

    Einmal editiert, zuletzt von ronnykornexl ()

Jetzt mitmachen!

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