%EC%9D%98%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%B3%80%EC%88%98%EC%97%90%20%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
diff
(파일이 동일한지 테스트) 의 출력이 있는지 테스트하고 싶습니다 echo "Passed $x" else echo "Failed $x"
. 나는 몇 가지 중간 단계를 생각해 냈습니다(diff의 출력을 파일로 저장한 다음 파일에서 읽습니다).
diff "./helloworld$x.out" "./output/helloworld$x.out" > tmp.txt;
output="`cat tmp.txt`";
if [ "$output" = "" ];
then
echo "Passed $x";
else
echo "Failed $x";
fi;
코드가 개선될 수 있다고 확신합니까? 주요 질문은: 출력을 diff
변수에 직접 저장할 수 있습니까 ?
답변1
이것은 작동합니다:
if diff "./helloworld$x.out" "./output/helloworld$x.out" >/dev/null; 그 다음에 echo "$x를 통과했습니다"; 또 다른 echo "$x 실패"; fi
대신 변수를 사용하는 경우 분기 echo
를 삭제할 수 있습니다 else
. 앞에 변수를 false로 설정 if
하고 코드 2줄을 저장하세요.
실제로 결과를 변수에 넣으려면 다음을 사용하십시오.
some_var="$(diff "./helloworld$x.out" "./output/helloworld$x.out")"
실제로 작동하는지 확인하기 위한 테스트를 포함합니다.
ronzwind@discworld:~$ 터치 1 ronzwind@discworld:~$ 터치 2 ronzwind@discworld:~$ 추가 테스트 차이가 1 2 >/dev/null인 경우; 그 다음에 echo "$x를 통과했습니다"; 또 다른 echo "$x 실패"; fi ronzwind@discworld:~$ ./test 합격 ronzwind@discworld:~$ vi 2 ronzwind@discworld:~$ 더 보기 2 2 ronzwind@discworld:~$ ./test 실패한
>/dev/null
부분 에서는 이 명령 앞의 동일한 파일('첫 번째 매개변수 사용'을 의미)에 출력 을 >/dev/null 2>&1
보내고 표준 오류를 보냅니다 (따라서 를 사용함 ).>/dev/null
2>&1
&1
/dev/null
참고: 목록 sdiff
이 나란히 표시됩니다 diff
.
sdiff 1 2 1 1 2 2 3 3 4 4 5 5 7 7 > 8 9 9 10 10
답변2
diff
아래 코드를 사용하면 "파일 /bin/bash와 /bin/sh가 다름" 메시지를 제외하고 출력을 완전히 억제할 수도 있습니다.
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
if diff -q "$file1" "$file2"; then
echo "Passed $x"
else
echo "Failed $x"
fi
해당 메시지를 숨기려면 > /dev/null
diff 명령 뒤에 추가하여 다음의 출력을 숨겨야 합니다 diff
.
if diff -q "$file1" "$file2" >/dev/null; then
/dev/null
블랙홀 역할을 하는 특수 파일입니다. 여기에 쓰면 사라지고, 읽으면 아무것도 돌려받을 수 없습니다.
;
Bash는 줄을 끝낼 필요가 없습니다 .
원래 질문의 경우 프로그램의 출력을 변수에 저장하려면 다음을 수행하십시오.
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
output="$(diff -q "$file1" "$file2")"
# the quotes are mandatory, this checks whether $output is empty or not
if [ -n "$output" ]; then
echo "Passed $x"
else
echo "Failed $x"
fi
변수가 비어 있는지 확인하는 다른 방법:
[ "$output" = "" ]
[ "$output" == "" ]
[[ "$output" == "" ]]
[[ $output == "" ]]
Bash를 사용하는 경우 문자열 비교를 위해 마지막 두 명령을 사용하는 것이 좋습니다. 그렇지 않은 경우 첫 번째 및를 [ -n "$output" ]
사용하는 것이 좋습니다.
답변3
a) command1의 출력은 다음과 같이 잡을 수 있습니다.
output=$(diff "helloworld$x.out" "output/helloworld$x.out")
또는 역따옴표를 사용하지만 중첩할 수 없고 글꼴에 따라 아포스트로피와 구별하기 어려울 수 있으므로 사용하지 않는 것이 좋습니다.
output=`cmd1`
b) 파일에 쓴 다음 해당 파일을 읽는 대신(또는 출력을 가져온 다음 에코하는) 파이프를 직접 사용합니다.
cmd1 > file
cat file | cmd2
output=$(cmd1)
echo "${output}" | cmd2
=>
cmd1 | cmd2
하지만 귀하의 예에서는 출력이 아니라 프로그램의 결과에 관심이 있습니다. 작동했습니까?
diff "helloworld$x.out" "output/helloworld$x.out" && echo "success" || echo "failure"
&& 및 || 사용에 대해 읽으려면 "바로가기 AND 및 바로가기 OR"를 검색하세요.
출력을 깨끗하게 유지하려면 'diff' 출력을 아무데도 리디렉션할 수 없습니다.
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null && echo "success" || echo "failure"
성공을 확인하고 나중에 평가하려면 마지막 명령의 결과를 $?를 사용하여 변수에 저장합니다.
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null
result=$?
# do something else
case $result in
0) echo success ;;
*) echo failure ;;
esac
답변4
두 파일이 동일한지 다른지 알고 싶다면(실제로 차이점이 무엇인지는 신경 쓰지 않음) 이 cmp
더 적합합니다.
if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi