명령(예: diff)의 출력을 변수에 저장하는 방법

명령(예: diff)의 출력을 변수에 저장하는 방법

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/null2>&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/nulldiff 명령 뒤에 추가하여 다음의 출력을 숨겨야 합니다 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

관련 정보