有没有什么办法可以解决管道破裂的问题?

有没有什么办法可以解决管道破裂的问题?

我有一个包含大量文件的目录。

./I_am_a_dir_with_many_subdirs/

在脚本中,我想找到其中的所有子目录,对它们进行排序并输出到 bash 数组。因此,我这样做:

SubdirsArray=(`find ./I_am_a_dir_with_many_subdirs/ -maxdepth 2 -mindepth 2 -type d | sort`)

执行脚本时,我收到以下错误消息:

    sort: write failed: standard output: Broken pipe
    sort: write error

正如本文所解释的邮政:可能在完成写入sort之前执行并关闭管道。因此,由 发起的 write() 命令会收到错误 EPIPE“管道损坏”,操作系统会发送SIGPIPE。在 SIGPIPE 到达 之前,它会打印错误消息,然后收到 SIGPIPE 并死亡。findfindfindfind

问题:

  1. 那么,我的目录包含什么?找到但未排序的SubdirsArray子目录?findsort

  2. 如果是这样,那么解决管道损坏问题的方法是什么?让 find 将其结果写入临时文件,然后让 sort 读取它?

    我不明白,为什么如果它发生在非交互式 shell 中,那么“也没什么可担心的”:为什么?我的SubdirsArray脚本中包含一些未排序的内容,而我假设它的元素是已排序的?!

  3. 我收到两条错误消息:

    sort: write failed: standard output: Broken pipe
    sort: write error
    

在此线提示说sort临时目录中没有足够的空间来对所有输入进行排序。但是,这难道不意味着 sort 从 find 中得到了一些东西吗?!?我很困惑……无论如何,我尝试使用

SubdirsArray=(`find ./I_am_a_dir_with_many_subdirs/ -maxdepth 2 -mindepth 2 -type d | sort -T /home/temp_dir`)

但没有帮助。

附言

我不确定它是否重要,但我find|sort在多处理器脚本中使用它:多个处理器在子 shell 中同时执行相同的命令。

答案1

sort: write failed: standard output: Broken pipe

问题不在于find和之间sortsort存在 的问题输出, 意思是shell 不愿意读取变量中的长列表。

您必须使用while read... 处理输入,如果多次需要,则将其存储在临时文件中。 还有一个额外的优势,即它只在换行符处进行拆分,因此它可以正确处理带空格的文件名,而反引号方法则不能。

不幸的是,你没有说你想如何使用结果,我无法告诉你如何准确地重写它。

请注意,数组不是 POSIX shell 规范的一部分,有些 shell 的速度明显比 bash 快,但没有数组。这就是为什么包括我在内的许多人经常避免在脚本中使用它们。

相关内容