![grep -v 예상치 못한 동작](https://linux55.com/image/91962/grep%20-v%20%EC%98%88%EC%83%81%EC%B9%98%20%EB%AA%BB%ED%95%9C%20%EB%8F%99%EC%9E%91.png)
다음과 같이 종료하여 파일을 삭제하는 간단하고 멍청한 스크립트가 있다고 가정해 보겠습니다.
rm *.uvw *.xyz
rm
정확하게 말하면 스크립트가 지정된 끝을 가진 파일을 하나 이상 찾을 수 없으면 stderr에 메시지를 씁니다.
이제 스크립트가 조금 더 크고 더 많은 파일 형식으로 더 많은 작업을 수행한다고 가정하면 어떤 파일 형식이 있고 어떤 파일 형식이 없는지에 대해서는 덜 관심이 있지만 존재하지 않는 파일 형식이 나머지 작업을 차단한다고 불평합니다. 출력과 오류 메시지에 더 관심이 있으므로 출력을 필터링하고 싶습니다.
rm *.uvw *.xyz 2>&1 | grep -v "No such file or directory"
이는 대부분의 경우 잘 작동하지만 쓰기 금지된 파일을 삭제해야 하는지 묻는 등 대화형 대화 상자의 메시지 부분을 제거하므로 해당 메시지 없이 프롬프트만 표시됩니다.
나는 이 동작을 이해하지 못하며 이에 대한 정보를 찾을 수 없습니다. 누군가 이것을 설명할 수 있나요?
답변1
질문
rm이 입력을 요구할 때 프롬프트 끝에 개행 문자를 추가하지 않습니다.
$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'?
grep
라인 기반입니다. 완전한 라인만 처리할 수 있습니다. 완료되기 전에 해당 줄을 인쇄해야 하는지 여부를 알 수 없습니다. 따라서 버퍼링 처리를 위한 표준 유틸리티(예 stdbuf
: )는 도움이 되지 않습니다.
해결책
nullglob을 사용하고 누락된 파일 메시지를 제거하십시오.
nullglob이 없으면 예상하지 못한 메시지가 표시됩니다.
$ rm *.uvw *.xyz
rm: cannot remove '*.uvw': No such file or directory
rm: remove write-protected regular empty file 'a.xyz'? n
이를 사용하면 "해당 파일이나 디렉터리가 없습니다"라는 메시지가 표시되지 않습니다.
$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'? n
다듬다
두 glob과 일치하는 파일이 전혀 없으면 다른 오류 메시지가 발생합니다.
$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: missing operand
Try 'rm --help' for more information.
이를 방지하는 간단한 방법은 해당 파일이 하나 이상 존재하는지 확인하는 것입니다.
shopt -s nullglob
[ -e "deleteme.xyz" ] ||touch deleteme.xyz
rm *.uvw *.xyz
deleteme.xyz
어차피 지워질 테니까 , 뛰기 전에 만져도 나쁠 건 없다 rm
.
답변2
GNU grep을 사용하는 경우 "-s" 옵션을 확인하여 메시지를 억제하세요.
-s, --no-messages
Suppress error messages about nonexistent or unreadable files.
*** 참고: 이는 휴대용 옵션이 아닙니다.