[bash] Parametervariablen



  • DIA_COMM="--backtitle Easy\ File\ Transfer --yes-label yyy"
    dialog --backtitle "${DIA_COMM}" --yesno "Fragwas" 20 60
    


  • ... dann ist aber leider der backtitle zu umfangreich



  • jetzt hab ich's: 💡

    DIA_COMM='--backtitle "Easy Bla bla" --yes-label yyy'
    echo "dialog "${DIA_COMM}" --yesno fragwas 20 30" > /tmp/tmp-dialog.del.me
    chmod u+x /tmp/tmp-dialog.del.me 
    /tmp/tmp-dialog.del.me
    rm /tmp/tmp-dialog.del.me
    


  • Es gab vor kurzem erst einen Thread, in dem es um genau das gleiche ging:
    http://www.c-plusplus.net/forum/viewtopic.php?p=1897737#1897737

    Letzter Stand in dem Thread war: Bash bietet dafür keine wirklich elegante Möglichkeit. Da du aber (anders als der in dem anderen Thread) bash benutzt, könntest du bash-Arrays nehmen.



  • meine Lösung unter "jetzt hab ich's ..." funktioniert aber.



  • zum Beispiel schrieb:

    meine Lösung unter "jetzt hab ich's ..." funktioniert aber.

    Die enthält aber race conditions und lässt unter Umständen eine temporäre Datei herumliegen. Temporäre Dateien zu handhaben ist nicht ganz einfach in bash.
    Zuerst einmal ist ein fester Name tabu, weil man damit race conditions und Sicherheitslücken erzeugt. Das Programm "mktemp" kann temporäre Dateien sicherer generieren.
    Dann muss man korrekterweise auch ein Trap setzen, um beim Beenden des Skripts die temporäre Datei wieder zu löschen. Ein Trap in bash ist im Prinzip eine Funktion, die aufgerufen wird, sobald etwas bestimmtes passiert, zum Beispiel wenn das Skript sich außerplanmäßig beendet.

    Mit diesen beiden Punkten (mktemp zum Erzeugen und trap zum Löschen der Datei) müsste man die größten Risikofaktoren behoben haben. Trotzdem versuche ich temporäre Dateien wo es geht zu vermeiden. In diesem Fall würde das zum Beispiel auch so gehen:

    FOO='dialog "${DIA_COMM}" --yesno fragwas 20 30'
    bash -c "$FOO"
    


  • das mit dem eindeutigen Namen sollte ja zu schaffen sein, etwa mit

    echo "dialog "${DIA_COMM}" --yesno fragwas 20 30" > /tmp/tmp-dialog$$.del.me
    

    und einem Test, ob diese Datei bereits existiert => Abbruch. Das ist keine wesentliche Einschränkung, denn eine Checkbox braucht nicht mehrfach unter der selben Prozeßnr zu laufen.

    Deine 2 Zeilen funktionieren bei mir übrigens nicht, da scheint zumindest ein export DIA_COMM zu fehlen, aber auch dann nicht.



  • zum Beispiel schrieb:

    das mit dem eindeutigen Namen sollte ja zu schaffen sein, etwa mit

    echo "dialog "${DIA_COMM}" --yesno fragwas 20 30" > /tmp/tmp-dialog$$.del.me
    

    und einem Test, ob diese Datei bereits existiert => Abbruch. Das ist keine wesentliche Einschränkung, denn eine Checkbox braucht nicht mehrfach unter der selben Prozeßnr zu laufen.

    Deine 2 Zeilen funktionieren bei mir übrigens nicht, da scheint zumindest ein export DIA_COMM zu fehlen, aber auch dann nicht.

    Damit ist Name erstens nicht eindeutig (er könnte vorher bereits existieren), zum anderen hast du damit race conditions, wenn du nicht ganz genau aufpasst. Das Programm "mktemp" berücksichtigt das alles schon, warum nicht das nehmen?

    Bei bash gilt übrigens: Ein export braucht man so gut wie nie, außer für Variablen, die auch child processes sehen sollen.
    Natürlich muss man vor meinem Beispiel die Variable "DIA_COMM" mit irgendeinem Wert füllen, aber soviel Transferleistung hab ich dir zugetraut. 🙂



  • Danke. 😃

    Deine 2 Zeilen funktionieren bei mir trotzdem nicht.



  • zum Beispiel schrieb:

    Deine 2 Zeilen funktionieren bei mir trotzdem nicht.

    Oh, OK. Ich gebe mal ein vollständiges Beispiel, das bei mir funktioniert:

    #!/bin/bash
    
    PARAMS='"A B" C'
    FOO='printf "%s - %s\n" '"$PARAMS"
    
    bash -c "$FOO"
    
    $FOO
    echo
    
    # Der rohe $FOO-Aufruf gerade eben entspricht dem folgenden:
    printf \"%s - %s\\n\" \"A B\" C
    echo
    
    exit 0
    

    Ausgabe:

    A B - C
    "-"%s\n"""A"B""C
    "-"%s\n"""A"B""C
    

    Das bash -c ergibt das erwartete Ergebnis, der direkte Aufruf von $FOO liefert wegen word splitting völligen Blödsinn. Funktioniert das bei dir?

    Ich seh gerade, ich hab in meinem vorletzten Posting single und double quotes vertauscht. Den Code in diesem Posting habe ich aber getestet.



  • zum Beispiel schrieb:

    jetzt hab ich's: 💡

    DIA_COMM='--backtitle "Easy Bla bla" --yes-label yyy'
    echo "dialog "${DIA_COMM}" --yesno fragwas 20 30" > /tmp/tmp-dialog.del.me
    chmod u+x /tmp/tmp-dialog.del.me 
    /tmp/tmp-dialog.del.me
    rm /tmp/tmp-dialog.del.me
    

    hmmm, so wäre es einfacher

    DIA_COMM='--backtitle "Easy Bla bla" --yes-label yyy'
    `echo "dialog "${DIA_COMM}" --yesno fragwas 20 30"`
    

    und daruf bin ich schon selber gekommen aber das ist mir einfach zu umständlich.

    Christoph schrieb:

    Es gab vor kurzem erst einen Thread, in dem es um genau das gleiche ging:
    http://www.c-plusplus.net/forum/viewtopic.php?p=1897737#1897737

    Letzter Stand in dem Thread war: Bash bietet dafür keine wirklich elegante Möglichkeit. Da du aber (anders als der in dem anderen Thread) bash benutzt, könntest du bash-Arrays nehmen.

    so sieht es aus, schade.

    Naja, ich hab es so "gelöst", dass ich anstatt Leerzeichen jetzt einen Punkt habe, sieht nicht mehr ganz schick aus, aber was soll's, es musste gestern fertig werden.

    Danke für Antworten.


Anmelden zum Antworten