【问题标题】:why the file command in a for loop behaves so ridiculous为什么 for 循环中的 file 命令表现得如此荒谬
【发布时间】: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


【解决方案1】:

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

find -type f -exec file {} \;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多