Q: 기본 명령이 실패할 때 빈 파일 쓰기를 방지하려면 어떻게 해야 합니까?

Q: 기본 명령이 실패할 때 빈 파일 쓰기를 방지하려면 어떻게 해야 합니까?

명령을 실행하고 파일에 쓴 다음 해당 파일을 다른 용도로 사용하려고 합니다.

내가 필요한 것의 요점은 다음과 같습니다.

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

관련 정보