#linux #shell #testing #sh
Вопрос:
Я реализовал оболочку, и она работает нормально. Я могу запускать такие команды, как «pwd», «ls», «cd», «задания». Когда я вручную тестирую каждую команду, все проходит гладко.
Но я пытаюсь протестировать свою оболочку с помощью тестового сценария, и все мои тесты проваливаются.
У меня есть скрипт, который принимает несколько вариантов ввода (из папки «входы»).
У меня есть папка «возврат», в которой есть все исходные данные для входных данных.
Когда я запускаю сценарий, создается новая папка «myoutputs», в которой есть фактический вывод и любое сообщение об ошибке.
Мой ввод1 содержит команду «кот
Мой справочный вывод таков
[shell grading]$ Hello, World This is a test file to check shell programs. Thanks for your time! [shell grading]$
Но результат, который я получаю, таков :
Hello, World This is a test file to check shell programs. Thanks for your time! [shell grading]$ [shell grading]$ [shell grading]$ [shell grading]$ [shell grading]$ [shell grading]$ [shell grading]$ [shell grading]$ [shell grading]$
Я не понимаю, почему строка запроса была напечатана так много раз.
тестовый скрипт:
outdir=$1 total=31 mkdir -p $1 FILE=$2 if [[ ! -f "$FILE" ]] then echo "The executable you mentioned does not exist. Please check the name and try again." exit 1 fi for i in $( eval echo {1..$total}) do ./preprocess.sh FILE=inputs/input${i} if [[ ! -f "$FILE" ]] then echo "Input $i is missing, please fix before proceeding" exit 1 fi $(cat lt; inputs/input${i} | ./$2 gt; $1/output${i} 2gt; $1/erroroutput${i}) done printf "$2 run sucessfully on all inputsnnGrading against reference outputs:n" count=0 errorlog="" result="" erroresult="" for i in $( eval echo {1..$total}) do FILE=$3/refoutput${i} FILE2=$3/referroroutput${i} if [[ ! -f "$FILE" || ! -f "$FILE2" ]] then echo -n "0 " errorlog ="Reference output for input $i is missing.nn" continue fi result="" erroresult="" output=$(cat lt; $1/output${i}) refoutput=$(cat lt; $3/refoutput${i}) erroroutput=$(cat lt; $1/erroroutput${i}) referroroutput=$(cat lt; $3/referroroutput${i}) result=$(diff $3/refoutput${i} $1/output${i}) errorresult=$(diff $3/referroroutput${i} $1/erroroutput${i}) if [ "${result}" == "" ] amp;amp; [ "${errorresult}" == "" ] then echo -n "1 " count=$((count 1)) continue else echo -n "0 " errorlog ="Error in input $in" if [ "${result}" != "" ] then errorlog ="Your output:n$outputnExpected output:n$refoutputnDifference: $resultnn" fi if [ "${errorresult}" != "" ] then errorlog ="Your output:n$erroroutputnExpected output:n$referroroutputnDifference: $errorresultnn" fi fi done printf "nnResult $count out of $totalnn" if [ "${count}" != "${total}" ] then printf "Error Log:n$errorlog" fi rm -f input.txt input2.txt output.txt append.txt rm -rf directory
Проблема в моей оболочке или в моем тестовом сценарии? Любое предложение очень ценится.
ОБНОВЛЕНИЕ: Я делаю что-то подобное в своей оболочке, чтобы отобразить приглашение.
void shell_loop() { char *line; struct job *job; int status = 1; struct zero_leak *next; while (1) { print_promt(); //call prompt line = ft_read_line(); if (strlen(line) == 0) { check_zombie(); continue; } garbage = NULL; job = ft_parse_command(line); free(line); if (job) { status = ft_launch_job(job); if (garbage){ while (garbage){ next = garbage-gt;next; free(garbage-gt;s); free(garbage); garbage = next; } } } else fprintf(stderr, "Error: invalid commandn"); } } int main(int argc, char **argv) { ft_init(); shell_loop(); return EXIT_SUCCESS; }
Комментарии:
1. Вероятно, вы печатаете приглашение безоговорочно после каждой «команды» в сценарии. В отличие от запуска сценария в виде одной команды. Отобразите только приглашение для интерактивного (пользовательского) ввода.
2. проверьте мои обновления в вопросе, пожалуйста.
3. Приглашение должно отображаться, когда оболочка будет готова к дополнительному вводу. Это может быть после выполнения одной команды, выполнения серии команд или в середине незавершенной команды (что происходит, когда оболочки любят
bash
использоватьPS2
вместоPS1
).