使用 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 和其他一些 shell 欺骗性地支持$(<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
您可以使用带有 cat 的 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。
因此我们不会因为缺少文件且无法读取而收到错误。
注意:所有文件对于 root 来说都是可读的。