IFS 变量和带有空格和换行符的文件名

IFS 变量和带有空格和换行符的文件名

(使用 Bash 4.4 和 5.0)

我正在处理包含空格、换行符和反斜杠的文件名问题。我经常读到使用这样的代码的建议:

oldIFS=$IFS 
IFS= 

while read -rd '' LINE ; do
     ...

或者

while IFS= read -rd '' LINE ; do
   ...

但是,我发现在这种情况下没有必要使用 IFS 变量。显然是这样:

我有一个包含这些文件的目录:

$ ls -a1
.
..
he\llo
hello?w o r l d
listing

这 ?第四个代表换行符。文件清单下面是产生输出的脚本:

$ cat listing
#!/bin/bash

#IFS=
i=0

while read -rd '' FILE; do
    (( i++ ))
    echo -n $i"  "
    ls -ld "$FILE"
done

现在使用查找-print0 | 。/清单给我这个输出”

$ find -print0 | ./listing
1  drwxr-xr-x 2 pi pi 4096 Feb 15 16:34 .
2  -rw-r--r-- 1 pi pi 6 Feb 15 06:12 ./hello?w o r l d
3  -rw-r--r-- 1 pi pi 6 Feb 15 05:30 ./he\llo
4  -rwxr--r-- 1 pi pi 99 Feb 15 16:34 ./listing

这完全没问题。如果我在脚本中去掉IFS前面的#,结果是一样的清单

因此,这里似乎没有必要修改 IFS。

我错过了一个角度吗?什么情况下这里需要IFS=?

相关内容