명령 호출이 성공한 경우에만 출력 리디렉션

명령 호출이 성공한 경우에만 출력 리디렉션

diff명령의 출력(이 경우)을 파일로 리디렉션 하고 싶지만 비교하는 파일에 차이가 있는 경우에만 가능합니다. 예를 들어, a, b, 세 개의 파일이 있다고 가정해 보겠습니다. c여기서 ab는 동일하지만 ac그렇지 않습니다.

diff a c > output.txt이렇게 하면 diff a b > output.txt차이가 있든 없든 output.txt생성이 됩니다. output.txt차이가 있는 경우 에만 생성하고 싶습니다 (예: 차이가 1을 반환함).

나는 비슷한 것을 하고 싶다:

if ! diff a c > /dev/null; then
    diff a c > output.txt
fi

그러나 명령을 두 번 실행할 필요는 없습니다. 나할 수 있다다음과 같이 명령 내용을 저장합니다.

res=$(diff a c)
if [ $? != 0 ]; then
    echo "$res" > output.txt
fi

그러나 나는 echo"중개자"로 개입하게 되어 몇 가지 문제를 일으킬 수 있습니다. 코드를 복제하지 않고 출력이 있는 경우에만 출력을 리디렉션/파일 생성하는 방법은 무엇입니까?

답변1

명령을 한 번 호출하고 출력을 리디렉션한 다음 차이를 만들지 않고 출력을 제거할 수 있습니다.

diff a c > output.txt && rm output.txt

답변2

diff적어도 파일이 다른 경우 상대적으로 비용이 많이 드는 명령입니다. 최소 변경 세트를 계산하는 것은 (상대적으로) CPU를 많이 사용합니다. 그러니 두 번 다시 하고 싶지 않은 것도 이해가 됩니다.

cmp그러나 CPU에 관한 한 가격은 저렴합니다. 파일 크기가 합리적이라고 가정하면(여러 GB 파일에 대해 diff를 호출할지는 의심스럽습니다) 성능 비용이 거의 없으며 동일한 파일을 사용하면 더 빠를 수도 있습니다.

if ! cmp -s a c; then # -s = silent, do not print results to console
    diff a c > output.txt
fi

답변3

임시 파일은 어떻습니까?

diff a c > /tmp/output.txt
if [ $? != 0 ]; then mv /tmp/output.txt /my/folder/output.txt; else rm -f /tmp/output.txt; fi

확인 대화 상자를 제거하려면 -f로 바꾸십시오.-i

이렇게 하면 echo, printf 등 임시 변수나 "중개자" 없이 명령을 두 번만 실행하면 됩니다.

관련 정보