我想将文本文件内容读入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
但它很丑陋而且很麻烦。那么,是否有更好的语法,或者这毕竟是猫的有效使用?
答案 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