$(

$(<file) 是 Shell 中一种简洁的文件内容读取语法,等价于 $(cat file),但更高效(不启动外部 cat 进程)。注意:它不是 $(<file></file>) —— 后面的 </file> 是无效写法,属于常见误解。
正确写法只有 $(<file)(不含闭合标签或多余符号)。
✅ 正确用法:$(<file)
该语法由 Bash、Zsh 等主流 shell 原生支持(POSIX 不保证),作用是将 file 的全部内容(不含尾部换行)作为命令替换的结果返回。
content=$(<config.txt) echo "$content"
- 优势:比
$(cat config.txt)少一次进程 fork,更快更轻量。 - 注意:文件必须存在且可读,否则报错;空文件返回空字符串。
⚠️ 常见错误与避坑
-
$(<file></file>)是非法语法,shell 会报错(如syntax error near unexpected token '<')。 -
<file>单独写在命令行是重定向,但放在$()里必须严格遵循$(<file)格式,不能加空格、引号(除非路径含空格需用引号包住整个$(<"path with space"))。 - 不支持通配符展开:
$(<*.log)会尝试打开字面名为*.log的文件,不是批量读取。
? 实用场景示例
-
读取密钥或 token 直接用于命令:
curl -H "Authorization: Bearer $(<token.txt)" https://api.example.com
-
赋值给变量并处理(注意用双引号避免单词分割):
version=$(<VERSION) echo "Running v$version"
-
判断文件是否为空(配合
-z):if [ -z "$(</tmp/flag)" ]; then echo "flag is empty or missing" fi
? 替代方案(兼容性更强)
如果脚本需 POSIX 兼容(如在 dash 或 ash 下运行),请改用:
content=$(cat file) # 可靠,但稍慢 # 或更安全的写法: content=$(cat "file" 2>/dev/null) # 静默错误
不复杂但容易忽略。



















