$(<file) 是 shell 中高效读取文件内容的语法,等价于 $(cat file) 但不启动外部进程,要求文件存在可读,不支持通配符,posix 不保证兼容。

$(<file> 是 Shell 中一种简洁的文件内容读取语法,等价于 <code>$(cat file),但更高效(不启动外部 cat 进程)。注意:它不是 $(<file></file>) —— 后面的 是无效写法,属于常见误解。
正确写法只有 $(<file>(不含闭合标签或多余符号)。</file>
✅ 正确用法:$(<file></file>
该语法由 Bash、Zsh 等主流 shell 原生支持(POSIX 不保证),作用是将 file 的全部内容(不含尾部换行)作为命令替换的结果返回。
content=$(<config.txt echo><ul> <li>优势:比 <code>$(cat config.txt)</code> 少一次进程 fork,更快更轻量。</li> <li>注意:文件必须存在且可读,否则报错;空文件返回空字符串。</li> </ul> <hr> <h3>⚠️ 常见错误与避坑</h3> <ul> <li> <code>$(<file></file>)</code> 是非法语法,shell 会报错(如 <code>syntax error near unexpected token ')。</code> </li> <li> <code><file></file></code> 单独写在命令行是重定向,但放在 <code>$()</code> 里必须严格遵循 <code>$(<file> 格式,不能加空格、引号(除非路径含空格需用引号包住整个 <code>$()。</code></file></code> </li> <li>不支持通配符展开:<code>$( 会尝试打开字面名为 <code>*.log</code> 的文件,不是批量读取。</code> </li> </ul> <hr> <h3>? 实用场景示例</h3> <ul> <li> <p>读取密钥或 token 直接用于命令:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6580" title="Linux installer"><img src="https://img.php.cn/upload/skill/000/000/081/179101817874041.jpg" alt="Linux installer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6580" title="Linux installer" class="overflowclass">Linux installer</a> <p class="overflowclass">先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。</p> </div> <a rel="nofollow" href="/xiazai/skill6580" title="Linux installer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <pre class="brush:bash;toolbar:false;">curl -H "Authorization: Bearer $(<token.txt https:></token.txt>
赋值给变量并处理(注意用双引号避免单词分割):
version=$(<version echo v></version>
判断文件是否为空(配合 -z):
if [ -z "$(/flag)" ]; then
echo "flag is empty or missing"
fi
? 替代方案(兼容性更强)
如果脚本需 POSIX 兼容(如在 dash 或 ash 下运行),请改用:
content=$(cat file) # 可靠,但稍慢 # 或更安全的写法: content=$(cat "file" 2>/dev/null) # 静默错误
不复杂但容易忽略。










