저는 bash를 사용하는 데 상당히 익숙하며 일부 테스트 사례를 실행하기 위해 자동 학습 스크립트를 만들려고했습니다. 현재 내 bash 스크립트가 이상하게 작동하는 것 같습니다. -e 플래그가 설정되면 diff가 양수 크기 일 때 bash가 종료되고 -e 플래그가 설정되지 않으면 스크립트는 diff 파일의 차이를 무시하고 모든 테스트가 통과되었다고 말합니다.diff를 사용하는 중 오류없이 종료하는 Bash 스크립트
"write_diff_out = ...."명령 바로 다음에 스크립트가 종료되고 다음 줄이 인쇄되지 않습니다. 나는 그 밖의 모든 것들이 잘 실행되도록 스크립트의 diffing 부분만을 포함 시켰습니다 (파일들은 모두 존재합니다).
# Validate outputs and print results
echo "> Comparing current build's final memory output with golden memory output...";
for file in `ls test_progs`;
do
file=$(echo $file | cut -d '.' -f1);
echo "$file";
write_diff_out=$(diff ./log/$file.writeback.out ./log/$file.writeback.gold.out > ./diff/$file.writeback.diff);
echo "Finished write_diff";
program_diff_out=$(diff -u <(grep -E '@@@' ./log/$file.program.out) <(grep -E '@@@' ./log/$file.program.gold.out) > ./diff/$file.program.diff);
echo "Finished program diff";
if [ -z "$write_diff_out" ] && [ -z "$program_diff_out" ]; then
printf "%20s:\e[0;32mPASSED\e[0m\n" "$file";
else
printf "%20s:\e[0;31mFAILED\e[0m\n" "$file";
fi
done
echo "> Done comparing test outputs.";
diff 명령의 형식을 지정하는 더 좋은 방법을 제안해도 좋지만 다른 방법으로 작성하는 것이 좋습니다.
팁 : [ls을 구문 분석하지 마십시오.] (http://mywiki.wooledge.org/ParsingLs) 대신'for file in test_progs/*'를 실행하십시오. 또한, 줄 끝에서';'를 사용하지 않아도됩니다. (같은 행의 명령을 구분하는 데 사용됩니다. '예 : this') – darque
'-e flag'의 의미를 이해하지 못합니다. 'bash -e' 또는'diff -e'를 의미합니까? 나는 또한 당신이'write_diff_out = $ (diff ... ...> diff/$ file.writeback.diff)'로 성취하고자하는 것을 이해할 수 없다. 아마도'diff/$ file.writeback.diff'가 비어 있는지 테스트해야합니다. – darque
-e 플래그는 내가 생각하는 bash -e 플래그입니다 (bash 스크립트 맨 위에 "set -e"라고 부르는 플래그). write_diff_out 변수는 diff의 내용을 포함하고 diff를 지정된 파일에 기록하기위한 것입니다. 당신이 아래에 게시 한 방법은 더 깨끗해 보이지만 그렇게 할 것입니다. – Bill