пользовательская оболочка ведет себя по-другому во время выполнения теста

#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 ).