Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 

Als ich versuchte ein bash Script welches sich selbst aktualisiert sobald eine neuere Version verfügbar ist und sich selbst noch einmal mit der neuen Version aufruft mit den initialen Scripaufrufparametern bekam ich Probleme. Beim erneuten Aufruf wurden die Parameter nicht mehr genau so übergeben wie sie initial eingegeben wurden. Besonders Leerzeichen in Stringparametern bereiteten Probleme. Der Scripupdate soll ja für den Aufrufen unbemerkt stattfinden und der Aufrufer immer die aktuellste Version benutzen.

 

String Parameter mit Leerzeichen bereiten besonders Probleme. Der naheliegende Ansatz ist den Parameter $@ beim erneuten Aufruf mitzugeben aber es funktioniert so nicht. Wenn man allerdings die Aufrufparameter in einem Array ablegt und dann den gesamten Arrayinhalt beim Aufruf mitgibt funktioniert die Parameterweitergabe perfekt.

parameters=()
for (( i=1; i<=$#; i++ )); do
    parameters+=("${!i}")
done

Der Scriptaufruf muss dann wie folgt aussehen:

exec "$(which bash)" --noprofile "$0" "${parameters[@]}"   

Beispielcode  kann hier runtergeladen werden.

 

Update 19.12.2020: Manul hat freundlicherweise in einem Kommentar darauf hingewiesen dass es wesentlich  einfacher ist die Parameter mit Leerzeichen weiterzureichen und keine Arrays benutzt werden muessen.

Kommentar schreiben

*** Hinweis ***

Kommentare sind erwünscht. Aber um lästige Spamposts abweisen zu können gibt es ein paar Dinge die zu beachten sind:
  1. Kommentare mit dem Text http werden sofort zurückgewiesen mit der Meldung Sie sind nicht berechtigt den Tag zu verwenden. zz
  2. Kommentare werden manuell überprüft und es dauert deshalb in der Regel einen Tag bis sie veröffentlicht werden.

    Kommentare   
    #2 framp 2020-12-19 13:41
    Moin Manul,

    vielen Dank fuer den Tipp. Der Trick scheint zu sein die Tueddelchen zu benutzen :-) Keine Ahnung warum ich darauf nicht gekommen bin. Beim Suchen im Netz wurde immer wieder der Trick mit den Arrays genannt.

    Cu framp
    Zitieren
    #1 Manul 2020-12-19 13:28
    Du kannst auch einfach "$@" (mit Anführungszeichen) übergeben:

    $ cat 1.sh
    #!/bin/bash
    ./2.sh "$@"
    $ cat 2.sh
    #!/bin/bash
    echo $1
    echo $2
    $ ./1.sh "a b c" "d e f"
    a b c
    d e f
    $
    Zitieren