我想将文本文件内容读入Bash变量,如果该文件不存在则禁止显示错误消息.在POSIX中,我会这样做
var=$(cat file 2>/dev/null)
Run Code Online (Sandbox Code Playgroud)
但我读过(例如,如何将文件读入shell中的变量),这是在Bash中无用的猫.所以,我正在尝试这些:
var=$(< file 2>/dev/null)
var=$(< file) 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但它首先不读取现有文件,-bash: file: No such file or directory如果文件不存在则打印.为什么这不起作用?(特别是:什么彻底打破了第一个?)
这是什么工作:
{ var=$(< file); } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但它很丑陋而且很麻烦.那么,是否有更好的语法,或者这毕竟是猫的有效用途?
使用BASH可以很容易地在读取文件之前测试文件是否存在
[ -e file ] && var=$(< file )
Run Code Online (Sandbox Code Playgroud)
由于Inian在评论中指出该文件可能存在,但用户可能没有足够的权限来读取它。该-r测试将采取照顾。
[ -r file ] && var=$(< file )
Run Code Online (Sandbox Code Playgroud)
重定向适用于命令行的输出。当cat命令产生错误时,您可以像之前所做的那样重定向 stderr。
但是,当您在命令行本身内生成错误时,通过从不存在的文件进行输入重定向,该 shell 就是产生错误的那个 shell,并且您不会将其输出重定向到任何特殊的地方。您已经成功地发现了“丑陋且麻烦”的解决方法,它使用花括号模仿子 shell。
就我个人而言,我会使用一个if构造,但如果您确实更喜欢更短的代码而不是更少的对外部程序的调用,那么这是cat.