【问题标题】:Why does bash while loop try to process non-existent results of find?为什么 bash while 循环尝试处理不存在的查找结果?
【发布时间】:2021-04-15 19:21:40
【问题描述】:

我有一个 bash 脚本,它使用 while 循环来获取从 find 命令返回的每个文件的基本名称。我在这里将其简化为一行:

$ while read myFile; do echo $(basename $myFile) ; done <<< $(find ./*test*  -maxdepth 1 -type f -exec ls {} + 2>/dev/null)
testRelease.sh

在 find 命令没有结果的情况下,我预计 while 语句的条件不满足,“do”部分被忽略。事实并非如此:

$ while read myFile; do echo $(basename $myFile) ; done <<< $(find ./*noMatch*  -maxdepth 1 -type f -exec ls {} + 2>/dev/null)
basename: missing operand
Try `basename --help' for more information.

看起来好像while语句添加了一个条件试图处理的空行:

$ while read myFile; do echo $myFile ; done <<< $(find ./*noMatch*  -maxdepth 1 -type f -exec ls {} + 2>/dev/null)

$

独立运行 find 命令时不会出现此空白行。什么是添加这个空行,为什么没有找到结果时while语句会处理它?

【问题讨论】:

  • 一如既往,首先通过shellcheck.net 运行它并修复它指出的问题。
  • shopt -s nullglob
  • 只是想知道:-exec ls {} + 的意义何在? (隐含的)-print 不会做同样的工作但速度更快吗?
  • @Socowi 好点,谢谢
  • 注意,你使用的id...done &lt; &lt;(find...不会有这个问题。

标签: bash find do-while


【解决方案1】:

这个空行是什么

这里的字符串&lt;&lt;&lt; 正在添加一个尾随空行。如果你不想要它,你可以使用进程替换:

while read var; do ...; done < <(someCommand)

但是,在您的情况下,您根本不需要循环。 find -exec 可以更快更安全地为您完成这项工作:

find ./*test* -maxdepth 1 -type f -exec basename {} \; 2>/dev/null

【讨论】:

    【解决方案2】:

    请让我将您的命令简化为:

    while read line; do
        echo "line read"
    done <<< $(find . 1>/dev/null)
    

    find 命令什么也不输出,那么上面的代码就相当于:

    while read line; do
        echo "line read"
    done <<< ""
    

    它仍然打印“行读取”。 bash 的联机帮助页说:

    here文档的一种变体,格式为:

    [n]<<<word
    

    [线条被剪断]
    结果以单个字符串的形式提供,带有换行符 附加,到其标准输入上的命令(或文件描述符 n 如果 n 已指定)。

    然后while循环读取一个空行来执行echo
    如果将代码修改为:

    while read line; do
        echo "line read"
    done < <(find . 1>/dev/null)
    

    它不会输出任何东西。

    【讨论】:

      【解决方案3】:

      即使没有输出,您也至少将一个空字符串输入到循环中。您可以使用保证不会产生任何输出的命令来尝试它。我在这个实验中使用了空命令:

      while read; do echo read=$REPLY; done  <<<$(:)
      

      产生一个输出行,只是说

      读取=

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 2012-03-07
        • 1970-01-01
        • 2012-01-17
        • 2012-11-07
        • 1970-01-01
        相关资源
        最近更新 更多