명령 출력으로 파일을 덮어쓰려고 하는데 출력이 나오기 전에는 덮어쓰지 않습니다. 즉, 나는 보통
mycommand > myfile
하지만 빈 데이터로 덮어쓰게 된다면 myfile
이전 버전을 유지하고 싶은데 , myfile
뭔가를 사용하면 ifne
가능할 것 같아요.
mycommand | ifne (cat > myfile)
그러나 이것은 작동하지 않습니다 ...
간접적인 방법
mycommand | tee mytempfile | ifne mv mytempfile myfile
작동하지만 임시 파일을 사용하는 것은 우아하지 않다고 생각합니다.
묻다:첫 번째 아이디어가 왜 효과가 없었나요? 작동하도록 만들 수 있습니까? 아니면 내 원래 문제에 대한 또 다른 좋은 해결책이 있습니까?
답변1
첫 번째 방법이 작동하면 다음 명령을 실행하면 됩니다 ifne
(참고 자료 참조 man ifne
).
NAME
ifne - Run command if the standard input is not empty
SYNOPSIS
ifne [-n] command
DESCRIPTION
ifne runs the following command if and only if the standard input is
not empty.
그래서 실행 명령을 주어야 합니다. 거의 다 왔고 tee
일할 준비가 되었습니다.
command | ifne tee myfile > /dev/null
명령으로 생성되는 데이터가 많지 않고 데이터가 변수에 들어갈 만큼 작은 경우 다음을 수행할 수도 있습니다.
var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
답변2
보행자 솔루션:
tmpfile=$(mktemp)
mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
cat "$tmpfile" >myfile
fi
rm -f "$tmpfile"
즉, 출력을 임시 파일에 저장한 다음 비어 있는지 테스트합니다. 비어 있지 않으면 해당 내용을 파일에 복사합니다. 마지막으로 임시 파일을 삭제하세요.
cat "$tmpfile" >myfile
대신 cp "$tmpfile" myfile
(또는 )을 사용하여 mv
을 사용하는 것과 동일한 효과를 얻었습니다 mycommand >myfile
. 이는 기존 파일을 자르고 소유권과 권한을 보존하는 것입니다.
$TMPDIR
(에 의해 ) 메모리 마운트 파일 시스템에 있는 경우 mktemp
가능한 경우를 제외하고는 디스크에 기록되지 않습니다 myfile
. 그것은 또한 사용되는 것보다 휴대성이 더 좋습니다 ifne
.