如何抑制文件重定向错误?

如何抑制文件重定向错误?

使用 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允许您使用<file等价于cat file(或more file,受其NULLCMDREADNULLCMD选项影响)。

虽然 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 来说都是可读的。

相关内容