(使用 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=?