2016-04-09 5 views
1

Ich schreibe einen Test für ein Skript, das ich geschrieben habe, und funktioniert wie der einfachste tr-Befehl. Meine Idee für einen Test war, dass ich parallel tr-Befehl und mein Skript ausführen, Ausgabe in Variablen speichern und die Variablen vergleichen würde. Vor allem, wie man Skript von runnning forver stoppt? Ich lege Codes sowohl des Tests als auch meines Scipts bei. Zweitens, wie kann ich die Ausgabe meines Skripts und von tr in eine Variable speichern? Ich habe versucht, var = $ (Funktion), aber es funktioniert nicht. Und gibt es eine Möglichkeit, sie parallel anzurufen? Z.B. Ich werde den Test starten und dann 'abba' schreiben und ich möchte, dass beide Skripte es in "ABBA" ändern.Führen Sie Skript A in einem Skript B aus und beenden Sie dann Skript B, ohne Skript zu beenden. A

Und ist es eine gute Idee? Ich habe noch nie "formale" Tests geschrieben.

Prüfregeln:

#!/bin/bash 
**tr_znakiScript="/home/wiktoria/skrypty/testy/tr_znaki.sh" 
    echo "this script is about to run another script" 
    a=ab 
    b=AB 
    echo "$a" 
    echo "$b" 

    . $tr_znakiScript "$a" "$b" 

    exit 1 

# x=2; 
#while [ $x -le 2 ]; do 
#echo "Napis pojawił się po raz: $x" 
#x=$[x + 1] 
#hash=$(. $tr_znakiScript "$a" "$b") 
#. $tr_znakiScript "$a" "$b" 
#echo $hash 
#done 
#echo $hash** 

tr_znaki.sh Code

#!/bin/bash 
first_two="$1 $2" #zapisuje dwia pierwsze znaki do wspolnej zmiennej 
a="$1";b="$2" #rozdziela znaki 
split1=$(echo $a | fold -w 1) #rozdziela a na litery i wypisuje 
split2=$(echo $b | fold -w 1) #rozdziela a na litery i wypisuje 
arr1=($split1) #zapisanie stringu do tablicy 
arr2=($split2) #zapisanie stringu do tablicy 

shift #usuwa pierwszy argument 
shift #usuwa drugi argument 


size1=${#arr1[@]} #zapisanie rozmiaru arr1 do zmiennej 
size2=${#arr2[@]} #zapisanie rozmiaru arr2 do zmiennej 

# nieskończona pętla pozwalająca na ciągłe wpisywanie tekstu do translacji, przerywana standardowo ctrl + c 
while true 
do 
    read tekst #zmienna, do której wpisywany jest przez użytkownika tekst 
    mod=$tekst #zapisanie wpisanego tekstu do zmiennej 
    for ((i=0; i<${size1}; i++)); 
    do 
     mod=${mod//[${arr1[i]}]/${arr2[i]}} #nowa zmienna z zamianą którejś z wartości w arr na odpowiadającą wartość w arr2 
    done 
    echo $mod #wypisanie zmienionego tekstu 
    #sleep 1 #czeka sekundę 

done 
+0

Da Sie den '.' Befehl verwenden, führen Sie den B-Code im selben Interpreter wie A. Sie sind also das gleiche Programm. –

Antwort

2

Versuchen nohup.

Beispiel:

$(nohup ./your/script/here.sh > somefile.out 2> somefile.err < /dev/null &) 

Der nohup Befehl im Grunde kann Sie einen Prozess im Hintergrund laufen, aber in der Zwischenzeit können Sie nicht mit irgendwelchen Mitteln mit dem Programm interagieren (außer es zum Beenden). (Siehe nohup docs für Details)

Sie können somefile.out für Ihre Ausgabe überprüfen.

Zum Beenden können Sie auch top (Prozessmanager) oder kill -SIGTERM PID verwenden (dies kann in Ihrem Skript verwendet werden: $(kill -SIGTERM PID)). (PID ist Ihre Prozess-ID, die auch oben zu finden ist.)

Zum Vergleichen Ihrer Ausgaben können Sie ./your/script/A.sh > file.out verwenden und dann können Sie die diff file.out somefile.out verwenden, um die Unterschiede der beiden Dateien zu überprüfen.

+0

'nohup' führt keinen Befehl im Hintergrund aus. 'nohup' ermöglicht es Ihnen, einen Befehl auszuführen, der gegen Aufhängen immun ist, mit Ausgabe an ein Nicht-Tty. Dies ist auch der Grund, warum Sie am Ende der Zeile ein '&' hinzugefügt haben, was dazu führt, dass der Befehl im Hintergrund ausgeführt wird. –

+0

Dort. Behoben mit "erlaubt dir" – ForceMagic