파일 리디렉션 오류를 억제하는 방법은 무엇입니까?

파일 리디렉션 오류를 억제하는 방법은 무엇입니까?

cat을 사용하면 다음과 같이 "해당 파일이나 디렉터리가 없습니다"라는 오류를 숨길 수 있습니다.

cat file.txt 2>/dev/null

그러나 이것은 오류를 보여줍니다

< file.txt 2>/dev/null
bash: file.txt: No such file or directory

파일이 발견되면 파일 내용을 인쇄하고, 파일을 찾을 수 없으면 오류를 숨기려면 어떻게 해야 합니까?

참고: 의도적으로 cat 명령 사용을 피하고 있습니다.:https://stackoverflow.com/questions/11710552/useless-use-of-cat

답변1

순서를 변경하고 stderr를 /dev/nullFIRST로 리디렉션하세요.

%% <file.txt 2>/dev/null
bash: file.txt: No such file or directory
%% 2>/dev/null <file.txt
%%

리디렉션은 항상 왼쪽에서 오른쪽으로 수행된다는 점을 기억하세요. 리디렉션이 실패하면 stderr이 이미 예측된다는 것입니다.


그러나 내가 아는 한, (또는 , 해당 및 옵션의 영향을 받음) 과 동등한 것만 zsh사용할 수 있습니다 .<filecat filemore fileNULLCMDREADNULLCMD

Bash와 일부 다른 쉘은 $(<file)특수한 형태의 명령 대체를 기만적으로 지원하지만 정확한 형태만 지원하며 그 이상은 지원하지 않습니다.

bash% echo text > file
bash% <file
bash% echo $(<file)
text
bash% echo $(<file;<file)

bash%

zsh에서:

zsh$ <file
text
zsh$ <file >out
zsh$ <out
text
zsh$ echo $(<file;<file)
text text

답변2

첫 번째 예는 귀하의 요구 사항을 충족합니다.

두 번째 예는 명령이 없기 때문에 유용한 작업을 수행하지 않습니다. 리디렉션을 표시하려는 경우표준 입력cat <file존재하지 않을 때 생성된 오류 숨기기와 같은 명령에는 세 가지 옵션이 file있습니다 .

[ -f file ] && cat <file           # subject to race condition

( exec 2>/dev/null; cat <file )    # subshell discards all error output

( cat <file ) 2>/dev/null          # subshell discards all error output

를 사용하는 경우 및 를 및 로 bash바꿀 수 있습니다 .( ... ){ ...; }[ ... ][[ ... ]]

답변3

고양이와 함께 find를 사용할 수 있습니다.

find . -name file.txt -exec cat {} \;

존재하는 경우 파일 내용을 반환하고, 찾을 수 없으면 프롬프트를 반환합니다. 찾고 있는 곳에서 실행하거나 /tmp와 같은 경로로 변경하세요.

find /tmp/ -name file.txt -exec cat {} \;

답변4

이 시도,

find . -maxdepth 1 -name file.txt -type f -readable -exec cat {} \;
  • -maxdepth 1현재 디렉터리만 확인
  • -name파일 이름의 기본은 패턴과 일치합니다.
  • -type -f파일 형식은 일반 파일입니다.
  • -readable읽을 수 있는 파일 일치
  • exec cat위의 조건을 만족한 후 cat 명령을 실행합니다.

따라서 파일이 없어 읽을 수 없기 때문에 오류가 발생하지 않습니다.

참고: 루트는 모든 파일을 읽을 수 있습니다.

관련 정보