ファイルリダイレクトエラーを抑制する方法は?

ファイルリダイレクトエラーを抑制する方法は?

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

最初の例はあなたの要件を満たしています。

2番目の例では、コマンドがないため、役に立つことはありません。リダイレクトを表示する場合標準入力cat <file存在しないときに生成されるエラーを隠すなどのコマンドには3つのオプションが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コマンドを実行します。

したがって、ファイルがないため読み取れないため、エラーは発生しません。

注:ルートはすべてのファイルを読み取ることができます。

関連情報