STDOUT 리다이렉션시 오류가 발생하면 파일을 덮어쓰지 않는 것도 가능한가요?

STDOUT 리다이렉션시 오류가 발생하면 파일을 덮어쓰지 않는 것도 가능한가요?

이와 같은 명령에 간단한 구문 오류가 있습니다. Unix/Linux 호스트에서 실행해야 합니다.

$ echo "first string $PATH" > out.lst
$ ECHO second string %PATH% > out.lst

첫 번째 줄은 성공하여 출력 파일을 채우고, 두 번째 줄은 실패하여 이전에 채워진 파일을 비웁니다.

파일을 덮어쓰도록 출력되는 일부 명령을 호출할 때 오류가 발생할 경우를 대비하여 파일 내용을 보존하는 방법을 찾으려고 합니다.

사용 사례는 약간 이상합니다. 저는 기본 운영 체제(아마도 Linux 또는 Windows)에서 명령을 호출하도록 설계된 Oracle SQL*Plus용 이식 가능한 SQL 스크립트를 작성하려고 합니다. 운영 체제를 감지할 수 없기 때문에 두 플랫폼 모두에 대해 명령을 호출하고 예외를 발생시키지 않음으로써 작동하도록 노력하고 있습니다.

Windows에서는 두 줄이 모두 성공하고 두 번째 줄이 첫 번째 줄을 덮어씁니다. Linux에서는 두 번째 줄이 실패하지만 파일 내용을 보존하고 싶습니다.

답변1

을 사용하면 >실제 리디렉션이 발생하기 전에 파일이 항상 비워집니다. >>를 사용하여 동일한 대상에 후속 리디렉션을 연결할 수 있습니다 .

답변2

Windows 및 Unix에서 스크립트를 실행하는 데는 다음과 같은 많은 트릭이 있습니다.이것스택오버플로우에 대한 질문입니다.

예: :unix 명령의 시작 부분 에 a를 넣어 cmd.exe건너뛰도록 하고 a #를 끝에 넣어 unix 쉘이 추가 캐리지 리턴을 차단하지 않도록 합니다.

:; echo "unix path = $PATH" > out.lst; exit #
@echo off
echo windows path = %PATH% > out.lst

여러 줄이 필요한 경우 goto label .. : labelUnix 쪽의 여기 문서와 Windows 쪽의 문서를 결합해야 합니다.

:; true <<EOT
@echo off
echo windows path = %PATH% > file.txt
echo windows sux
goto skip
EOT
echo "linux path = $PATH" > file.txt #
echo linux sux #
: skip

<<EOT이 줄의 마지막 줄이어야 하며 유닉스 섹션의 모든 줄은 줄 이나 파일 이름 끝에 가짜 내용이 추가되는 것을 #방지하기 위해 a로 끝나야 합니다.^M

관련 정보