Das BICsuite Run Program Teil 3: Backticks

In der Bourne-Shell ist es möglich, einer Variablen die Ausgabe (stdout) eines Programms zuzuweisen. Ausdrücke wie:

A=`expr $A + 1`

waren früher sehr verbreitet. Da viele Umgebungen jetzt die Bash anstelle der Bourne-Shell verwenden, verschwindet diese Art von Ausdrücken allmählich.

Die gute Nachricht ist, dass der Scheduling Server die Backticks kennt. Er behandelt sie wie doppelte Anführungszeichen, entfernt sie jedoch nicht. Die Parameterersetzung wird weiterhin durchgeführt und das Argument wird nicht an einem Leerzeichen unterbrochen.Umgehung von Einschränkungen

Testen wir also, wie es funktioniert. Zuerst müssen wir etwas ausführen, also berechnen wir die Primzahlen kleiner als 100. Das Shell-Skript könnte so aussehen:

A=2;
primes="";
while [ "$A" -lt 100 ]; do 
    f=0;
    for P in $primes; do
        if [ `expr $A % $P -eq 0` ]; then 
            f=1;
            break;
        fi;
     done;
     if [ $f - eq 0 ]; then 
         primes="$primes $A"; 
         echo $A;
     fi;
     A=`expr $A + 1`;
done

Das kann einfach als Run Program ausgeführt werden, weil keine Parameter aus dem Scheduling-System verwendet werden. Es reicht aus, den gesamten Code in einfache Anführungszeichen zu setzen und ein “sh -c” davor zu setzen.

Das klingt nicht sehr anspruchsvoll, also machen wir die obere Grenze (100) konfigurierbar, indem wir einen Parameter verwenden, der beim Submit angegeben wird.

Wir beginnen mit einem groben Entwurf des Run Program, der so aussieht:

run program = sh -c ’
    A=2;
    primes="";
    while [ "$A" -lt $TESTPARM ]; do 
        f=0;
        for P in $primes; doUmgehung von Einschränkungen
            if [ `expr $A % $P` -eq 0 ]; then 
                f=1;
                break;
            fi;
         done;
         if [ $f -eq 0 ]; then 
             primes="$primes $A"; echo $A;
         fi;
         A=`expr $A + 1`; 
    done
,

Es handelt sich im Grunde um das selbe Skript, außer dass es in Anführungszeichen gesetzt wurde und der Wert 100 durch $TESTPARM ersetzt wurde. Es ist offensichtlich, dass Run Program in dieser Form keine Liste von Primzahlen ausgibt. Da der Parameter TESTPARM nur in einfachen Anführungszeichen vorkommt, wird er vom Server nicht berührt.

Wir müssen den Bereich mit einfachen Anführungszeichen beenden, einen Bereich mit doppelten Anführungszeichen starten und TESTPARM verwenden und dann den Bereich mit doppelten Anführungszeichen beenden und erneut einen Bereich mit einfachen Anführungszeichen beginnen. Mit anderen Worten:

run program = sh -c ’
    A=2;
    primes="";
    while [ "$A" -lt '"$TESTPARM"' ]; do 
        f=0;
        for P in $primes; do
            if [ `expr $A % $P` -eq 0 ]; then 
                f=1;
                break;
            fi;
         done;
         if [ $f -eq 0 ]; then 
             primes="$primes $A"; echo $A;
         fi;
         A=`expr $A + 1`; 
    done
,

Und tatsächlich liefert das das richtige Ergebnis:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

Jetzt haben wir die Backticks nicht so verwendet, dass der Scheduling Server sie sehen würde. Um ein Beispiel zu erstellen, das für den Scheduling Server sichtbare Backticks verwendet, multiplizieren wir TESTPARM mit 4 und verwenden das Ergebnis als Obergrenze. Lasst es uns versuchen:

run program = sh -c "
    M=`expr $TESTPARM \* 4`"’
    A=2;
    primes="";
    while [ "$A" -lt $M ]; do
        f=0;
        for P in $primes; do
            if [ `expr $A % $P` -eq 0 ]; then
                f=1;
                break;
            fi;
        done;
        if [ $f -eq 0 ]; then
            primes="$primes $A";
            echo $A;
        fi;
        A=`expr $A + 1`;
    done
 ’

Beachten Sie die hinzugefügten doppelten Anführungszeichen direkt nach dem -c, die direkt nach dem Backtick enden.


Teil 1: Einführung und einfache Anwendung

Teil 2: Fortgeschrittene Anwendung

Teil 3: Backticks

Teil 4: Andere Interpreter

Teil 5: Umgehung von Einschränkungen

Teil 6: Sicherheitsüberlegungen und Fazit