명령을 실행하고 파일에 쓴 다음 해당 파일을 다른 용도로 사용하려고 합니다.
내가 필요한 것의 요점은 다음과 같습니다.
myAPICommand.exe parameters > myFile.txt
문제는 myAPICommand.exe
실패가 많다는 것이다. 일부 문제를 해결하고 다시 실행해 보았지만 "기존 파일을 덮어쓸 수 없습니다"라는 문제가 발생했습니다. rm
공백을 정리 myFile.txt
한 다음 다시 실행 하려면 별도의 명령을 실행해야 합니다 myAPICommand.exe
.
가장 심각한 문제는 아니지만 짜증스럽습니다.
기본 명령이 실패할 때 빈 파일을 작성하지 않으려면 어떻게 해야 합니까?
답변1
"noclobber"를 설정해야 합니다. 다음 예를 확인하십시오.
$ echo 1 > 1 # create file
$ cat 1
1
$ echo 2 > 1 # overwrite file
$ cat 1
2
$ set -o noclobber
$ echo 3 > 1 # file is now protected from accidental overwrite
bash: 1: cannot overwrite existing file
$ cat 1
2
$ echo 3 >| 1 # temporary allow overwrite
$ cat 1
3
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ cat 1
3
$ set +o noclobber
$ echo 4 > 1
$ cat 1
4
"noclobber"는 덮어쓰기 전용이지만 다음을 추가할 수도 있습니다.
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1
플래그가 설정되어 있는지 확인하려면 echo $-
플래그가 설정되었는지 C
( 또는 set -o |grep clobber
) 입력하여 확인할 수 있습니다.
Q: 기본 명령이 실패할 때 빈 파일 쓰기를 방지하려면 어떻게 해야 합니까?
요청사항이 있나요? 간단히 출력을 변수에 저장하고 비어 있는지 확인할 수 있습니다. 다음 예를 확인하십시오. 변수를 확인하는 방법은 필요에 맞게 미세 조정해야 합니다. 예에서는 인용하지 않았거나 ${cmd_output+x}
변수가 다음과 같은 내용만 포함하는 파일을 작성하지 않도록 설정되어 있는지 확인하는 것과 같은 것을 사용하지 않았습니다. 공백.
$ cmd_output=$(echo)
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e '\n\n\n')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e ' ')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'something')
$ test $cmd_output && echo yes || echo no
yes
$ cmd_output=$(myAPICommand.exe parameters)
$ test $cmd_output && echo "$cmd_output" > myFile.txt
단일 변수를 사용하지 않고 전체 출력을 저장하는 예:
log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log
답변2
실행 후 파일을 삭제할 수 있습니다. 명령이 실패하면 다음을 사용하십시오.
myAPICommand parameters > myFile.txt || rm myFile.txt
하지만 대신 파일을 파기하는 것이 좋습니다.
myAPICommand parameters >| myFile.txt
바라보다쉘의 제어 및 리디렉션 연산자는 무엇입니까?더 알아보기.
답변3
myAPICommand.exe를 실행하는 스크립트를 생성할 수 있지만 먼저 myFile.txt가 있으면 삭제하도록 합니다. 그러면 정리를 위해 지속적으로 rm 명령을 실행할 필요가 없습니다.
좋다:
if [ -e myFile.txt ]
then
rm myFile.txt && myAPICommand.exe
else
명령이 자체적으로 정리되도록 이 작업을 수행할 수도 있습니다. 파일이 비어 있으면 다음 내용을 추가하세요.
좋다:
if [ -s myFile.txt ]
then
EXIT 0
else
rm myFile.txt && EXIT 1
fi