Bash中ls输出双引号包裹命令替换产生换行符问题咨询
问题原因拆解
- 首先是
ls命令的输出特性差异:当ls的输出目标是交互式终端时,会默认将文件名按多列布局、用空格分隔排列;但当输出目标是命令替换、管道这类非交互式场景时,ls默认每行输出一个文件名,文件名之间的分隔符是换行符,不是你以为的空格。 - 其次是双引号对命令替换结果的保护:你给
ls的命令替换套了双引号,Bash不会对替换结果执行单词拆分、通配符展开操作,所以ls输出里的所有换行符都会被完整保留在传给for循环的字符串中。 - 你看到的
'$'\n''是Bash对不可见字符的转义表示:实际字符串里存储的是原生的换行符,这串字符只是Bash在输出包含特殊不可见字符的字符串时,为了让你能看清楚分隔符类型做的转义展示,不是文件名里真的包含这串字符。
补充说明
你最初的理解有一个小偏差:只有主动给ls加-m参数的时候,ls才会输出用逗号+空格分隔的文件名列表,常规非终端输出场景默认都是换行分隔。另外遍历目录下的文件不要用ls,直接用通配符即可,正确写法如下:
for filename in DTEST/* ; do touch "$filename".txt done
这种写法天然处理文件名里包含空格、换行等特殊字符的场景,不会出现分隔符混淆的问题。
内容的提问来源于stack exchange,提问作者user14356197
相关产品推荐
相关产品推荐

