cat 命令在 shell 脚本中不起作用

cat 命令在 shell 脚本中不起作用

我有以下行在 ksh 中不起作用但在 sh 中工作正常:

cat `find /home/peter/databases -name "cells.txt"`

如果此行位于 /usr/bin/sh 脚本内,则此操作有效。但当它位于 /usr/bin/ksh 内时则不然。

有任何提示为什么会这样吗?

我在用:

SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 4

“不工作”意味着脚本挂起(类似于cat未提供文件名作为参数的行为)

find /home/peter/databases -name "cells.txt"ksh 脚本中的输出不为空。在这种情况下,脚本能够列出找到的文件。但是,如果我尝试使用上面提到的反引号来捕获找到的文件,就会出现问题。

find命令列出了近1000个文件,但大多数都是空的。上面说的 cat 命令在 sh 中有效,但在 ksh 中无效。

  • 不存在包含名称空间的文件。
  • 文件 cells.txt 的内容为空或单个语句。
  • 如果 /home/peter/databases 下的文件数量较少,则命令 (cat `find /home/peter/databases -name "cells.txt"`) 可以正常工作。在本例中,文件数为 1000。
  • 相同的命令在 SUSE 11.3 ksh 中运行。但是如果我在SUSE 11.4下执行它就会失败。
  • 我只在 /home/peter/databases 下的目录中保留了几个名为 cells.txt 的文件,该命令运行得很好。当名为 cells.txt 的文件增长到大约 1000 个时,该命令不会给出任何输出(挂起)。我怀疑是因为某些缓冲区用于输出反引号吗? (``) 因为 SUSE 11.3 没有任何问题,但 11.4 挂起。
  • -size +0该命令与 find 一起使用该选项。是否再次表明有关缓冲区的内容?

答案1

尝试将此作为替代解决方案,该解决方案cat仅在找到文件时才会调用

find /home/peter/databases -type f -name 'cells.txt' -exec cat {} +

(如果您的版本find不理解尾随+,请将其替换为两个字符\;

答案2

该脚本通过忽略 find 命令中的零文件大小来工作。(-size +0)

 cat `find /home/peter/databases -name "cells.txt" -size +0`

我也同意其他解决方案。但由于我的问题是找到 ksh 无法处理猫的原因是由于缓冲区大小(反引号的输出),所以我发布了我的答案。 @wurtel:谢谢。你的建议解决了这个问题。

相关内容