
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/null
FIRSTにリダイレクトします。
%% <file.txt 2>/dev/null
bash: file.txt: No such file or directory
%% 2>/dev/null <file.txt
%%
リダイレクトは常に左から右に行われていることを覚えておいてください。リダイレクトが失敗した場合、stderrはすでに予測されています。
しかし、私が知っている限り、(または、それらとオプションの影響を受ける)と同等のもののみをzsh
使用できます。<file
cat file
more file
NULLCMD
READNULLCMD
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コマンドを実行します。
したがって、ファイルがないため読み取れないため、エラーは発生しません。
注:ルートはすべてのファイルを読み取ることができます。