diff
none ( 출력 이 같은 경우 테스트)의 출력이 있는지 테스트하고 싶습니다 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
변수에 직접 저장할 수 있습니까?
답변
이것은 작동합니다 :
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")"
실제로 작동하는지 확인하기 위해 테스트를 포함합니다.
rinzwind @ discworld : ~ $ 터치 1 rinzwind @ discworld : ~ $ 터치 2 rinzwind @ discworld : ~ $ 더 많은 테스트 diff 1 2> / dev / null 인 경우; 그때 echo "통과 $ x"; 그밖에 echo "실패 $ x"; fi rinzwind @ discworld : ~ $ ./test 합격 rinzwind @ discworld : ~ $ vi 2 rinzwind @ discworld : ~ $ 더 2 2 rinzwind @ discworld : ~ $ ./test 실패한
온 >/dev/null
부분 : >/dev/null 2>&1
출력을 보낼 >/dev/null
과 2>&1
동일한 파일 (표준 오차 보낼 &1
명령 앞에 수단 ‘을 사용 첫번째 파라미터’) (도 사용 그렇게 /dev/null
).
sidenote : 단계별 목록 sdiff
이 표시됩니다 diff
.
sdiff 1 2 1 1 2 2 3 3 4 4 5 5 7 7 > 8 9 9 10 10
답변
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" ]
가 권장됩니다.
답변
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
답변
두 파일이 동일하거나 다른지 알고 싶지만 (차이가 무엇인지는 상관하지 않음) cmp
더 적합합니다.
if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi