将文件读入变量,同时抑制“无此文件或目录”错误

时间:2017-08-08 12:21:28

标签: bash

我想将文本文件内容读入Bash变量,如果该文件不存在则禁止显示错误消息。在POSIX中,我会做

var=$(cat file 2>/dev/null)

但我在Bash中读到(例如在How to read a file into a variable in shell)它是无用的猫。所以,我正在尝试这些:

var=$(< file 2>/dev/null)
var=$(< file) 2>/dev/null

但是第一个不读取现有文件,如果文件不存在则都打印-bash: file: No such file or directory为什么这不起作用?(特别是:什么彻底打破了第一个?)

这是什么工作:

{ var=$(< file); } 2>/dev/null

但它很丑陋而且很麻烦。那么,是否有更好的语法,或者这毕竟是猫的有效使用?

4 个答案:

答案 0 :(得分:5)

使用BASH,在

中读取文件之前,可以很容易地测试文件是否存在
presentCopy

由于Inian在评论中指出文件可能存在,但用户可能没有足够的权限来阅读它。 [ -e file ] && var=$(< file ) 测试可以解决这个问题。

-r

答案 1 :(得分:3)

var=$(cat file 2>/dev/null)

这是 Cat的有用用途。它强制执行操作顺序:在file打开之前重定向stderr。它有用。使用它不要感到难过。

答案 2 :(得分:2)

重定向适用于命令行的输出。当cat命令产生错误时,您可以在完成后重定向stderr。

但是当您在命令行中生成错误时,通过从不存在的文件输入重定向,THAT shell就是产生错误的shell,并且您不会将其输出重定向到任何地方特别。你已经成功地发现了这个丑陋而笨重的人。解决方法,使用花括号模仿子shell。

就个人而言,我使用的是if构造,但如果您真的更喜欢使用较短的代码而不是更少的外部程序调用,那么这是cat的完全有效使用。

答案 3 :(得分:0)

使用大括号定义命令块,并将整个块的stderr重定向到/dev/null

{ IFS= read -rd '' var <file;} 2>/dev/null