Linux 为什么for循环中的file命令行为如此荒谬

Linux 为什么for循环中的file命令行为如此荒谬,linux,bash,shell,for-loop,echo,Linux,Bash,Shell,For Loop,Echo,这个shell脚本将惊人地报告(文件名太长)。我猜脚本在文件中提供了3次$file\u列表 但是,如果我用一个简单的echo来更改file命令,那么脚本将按预期逐行打印当前目录中的所有文件。迭代find的结果不是一个好主意。改用它的exec选项: #!/bin/sh file_list=`find . -type f` IFS=$(echo) #this enables for loop to break on newline for file_ in $file_list; do fi

这个shell脚本将惊人地报告
(文件名太长)
。我猜脚本在
文件
中提供了3次
$file\u列表


但是,如果我用一个简单的
echo
来更改
file
命令,那么脚本将按预期逐行打印当前目录中的所有文件。

迭代
find
的结果不是一个好主意。改用它的
exec
选项:

#!/bin/sh

file_list=`find . -type f`

IFS=$(echo) #this enables for loop to break on newline
for file_ in $file_list; do
  file $file_
done

您正在将
IFS
设置为null并禁用分词。因此
文件
包含
find
的整个输出。这将有点太长,命令行无法工作<代码>回显正在“工作”,因为换行符可以显示。尝试在循环中使用
printf%s“$file”
declare-p file
,查看得到的结果。另请参阅,了解如何正确地从流中逐行读取数据。并阅读以了解为什么这是一个坏主意。您可能打算使用
IFS=$(echo)
(命令替换,而不是参数扩展)。但这仍然是个坏主意。即使是
IFS=$(echo)
也不起作用,因为命令替换会去除尾随的换行符,所以IFS仍然是空的
find -type f -exec file {} \;