echo $(cat filename)与cat filename有何区别?为何二者输出一致?
echo $(cat filename) 和 cat filename的核心区别与输出一致的原因 本质差异
cat filename:直接读取文件的原始内容并原样输出,所有空白符(换行、空格、制表符)、特殊字符都会完整保留,不会经过Shell层的额外处理。echo $(cat filename):会经过Shell的三层额外处理再输出结果:- 首先执行命令替换,调用
cat filename获取文件内容 - 按照当前Shell的
IFS(内部字段分隔符,默认值为空格、制表符、换行)将文件内容拆分为多个独立字段 - 若字段中包含
*/?/[]等通配符,会自动做文件名匹配展开 - 最终将所有处理后的字段用单个空格拼接,传递给
echo命令输出
- 首先执行命令替换,调用
输出完全相同的原因
只有当你测试的文件同时满足以下全部条件时,两者输出才会一致:
- 文件内容不存在连续的多个空白符(包括连续空格、制表符、空行)
- 文件末尾不存在多余的连续空行
- 文件内容中不包含Shell通配符
- 文件内容中没有Shell特殊转义字符
此时Shell的拆分、拼接操作不会改变内容的原有形态,因此最终输出和cat的结果没有区别。
常见输出差异场景
你可以尝试构造以下测试文件验证两者的差异:
- 文件包含连续空白符:如果文件里有空行、连续多个空格,
cat会原样保留所有空白符,echo $(cat filename)会把所有连续空白符替换为单个空格,空行会直接消失。 - 文件包含通配符:如果文件内容是
*.md,且当前目录存在多个md文件,cat会直接输出*.md,echo $(cat filename)会输出所有匹配到的md文件名。 - 文件末尾有多个空行:如果文件末尾有2个及以上连续空行,
cat会完整输出所有空行,echo $(cat filename)会在命令替换阶段去掉末尾所有换行,最终仅保留echo自带的1个末尾换行。
内容的提问来源于stack exchange,提问作者Steven Levine
相关产品推荐
相关产品推荐

