Bash中无法正确将js-beautify命令输出存入变量的问题咨询
问题成因
这个问题和js-beautify工具本身的功能无关,完全是Bash shell的解析规则导致的:
- 直接在终端执行
js-beautify somefile.js时,程序输出的格式化结果会完整保留换行、缩进(空格/制表符)等排版字符,直接打印到终端,所以你能看到符合预期的整洁格式。 - 用
readable=$(js-beautify somefile.js)捕获输出到变量时,变量里其实已经完整存储了所有格式化后的排版字符,内容没有丢失,问题出在你输出变量的写法上。
你执行的echo $readable没有给变量名包裹双引号,Bash在解析未加双引号的变量展开结果时,会触发**单词分割(word splitting)**机制:所有连续的空白字符(包括换行、制表符、连续多个空格)都会被替换成单个空格,原本的换行分段、代码缩进就全部被抹平,看起来就和没经过格式化的原始代码效果一致。
修复方法
输出存储了格式化内容的变量时,给变量加上双引号,就能完整保留所有排版格式:
echo "$readable"
如果要规避不同环境下echo命令对转义字符的解析差异,也可以用更严谨的POSIX标准写法输出:
printf "%s\n" "$readable"
你可以用以下极简测试复现、验证这个机制:
demo="function test() { console.log('indented line'); }" # 不加引号:格式全丢 echo $demo # 加引号:格式完整保留 echo "$demo"
注意:在Bash中所有需要保留变量值原始格式的场景,都应该给变量引用加上双引号,避免单词分割、通配符展开导致的非预期结果。
内容的提问来源于stack exchange,提问作者at_Root
相关产品推荐
相关产品推荐

