如何使 bash 替换 $(<"filename") 静音

rud*_*ier 2 bash command-substitution stderr

我想更换猫:

var=$(cat "filename" 2>/dev/null)
Run Code Online (Sandbox Code Playgroud)

通过 bashism 语法:

var=$(<"filename")
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何让 bashism 保持沉默以避免此类警告:

bash: filename: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我试过这个:

var=$(2>/dev/null <"filename")
Run Code Online (Sandbox Code Playgroud)

但它不再将现有文件读入var

ilk*_*chu 8

将赋值包装到一个复合块中并对其使用重定向似乎有效:

{ var=$(<"$file"); } 2>/dev/null;
Run Code Online (Sandbox Code Playgroud)

例如

$ echo hello > test1; rm -f test2
$ file=test1; { var=$(<"$file"); } 2>/dev/null; echo "${var:-[it is empty]}"
hello
$ file=test2; { var=$(<"$file"); } 2>/dev/null; echo "${var:-"[it is empty]"}"
[it is empty]
Run Code Online (Sandbox Code Playgroud)

只是不要( .. )用来创建子shell,因为那样分配的变量就会丢失。