【发布时间】:2015-11-05 15:26:35
【问题描述】:
#!/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
这个 shell 脚本会惊人地报告 (File name too long)。我猜这个脚本给file 提供了3 次$file_list !!!
但是如果我用简单的echo 更改file 命令,那么脚本将按预期逐行打印当前目录中的所有文件。
【问题讨论】:
-
您将
IFS设置为 null 并禁用分词。所以file_包含find的整个 输出。这对于命令行工作来说有点太长了。echo正在“工作”,因为换行符可以显示。尝试在循环中使用printf %s "$file_"或declare -p file_看看你会得到什么。 -
另请参阅Bash FAQ 001,了解如何正确地从流中逐行读取数据。并阅读 Don't read lines with for 了解为什么这是个坏主意。
-
您可能打算使用
IFS=$(echo)(命令替换,而不是参数扩展)。但这仍然是个坏主意。 -
即使
IFS=$(echo)也不起作用,因为命令替换会去除尾随换行符,所以 IFS 仍然是空的
标签: linux bash shell for-loop echo