2016-04-09 3 views
1

Я пишу тест для сценария, который я написал, и работает как простейшая команда tr. Моя идея теста заключалась в том, что я буду запускать параллельную команду tr и мой скрипт, сохранять вывод в переменных и сравнивать переменные. Прежде всего, как остановить скрипт из runnning forver? Я прилагаю коды как теста, так и моего сеанса. Во-вторых, как сохранить вывод моего скрипта и tr в переменную? Я пробовал var = $ (function), но он не работает. И есть ли способ вызвать их параллельно? Например. Я начну тест, а затем напишу 'abba', и я бы хотел, чтобы оба скрипта изменили его на pallalel на 'ABBA'.Запустить сценарий A внутри сценария B, а затем выйти из сценария B без выхода из сценария A

И это хорошая идея? Раньше я никогда не писал «формальные» тесты.

код теста:

#!/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 код

#!/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

Поскольку вы используете команду '.', вы выполняете код B в том же интерпретаторе, что и A. Таким образом, они являются одной и той же программой. –

ответ

2

Попробуйте nohup.

Пример:

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

Команда поЬир в основном позволяет запускать процесс в фоновом режиме, но в то же время, вы не можете взаимодействовать с программой любыми средствами (за исключением прекращения его). (Подробности см. В документах nohup).

Вы можете проверить somefile.out для вашего вывода.

Кроме того, для прекращения использования вы можете использовать top (диспетчер процессов) или kill -SIGTERM PID (это может использоваться в вашем скрипте: $(kill -SIGTERM PID)). (PID - это ваш идентификатор процесса, который также можно найти в верхней части.)

Для сравнения выходов вы можете использовать ./your/script/A.sh > file.out, а затем вы можете использовать diff file.out somefile.out для проверки различий между двумя файлами.

+0

'nohup' не запускает команду в фоновом режиме. 'nohup' позволяет вам запускать команду, которая невосприимчива к зависаниям, с выходом на не-tty. Это также причина, по которой вы добавили '&' в конце строки, что приводит к тому, что команда выполняется в фоновом режиме. –

+0

Там. Исправлено с помощью «позволяет» – ForceMagic