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

SS *_*gde 1 shell suse opensuse ksh shell-script

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

cat `find /home/peter/databases -name "cells.txt"`
Run Code Online (Sandbox Code Playgroud)

如果此行在 /usr/bin/sh 脚本中,这将起作用。但当它在 /usr/bin/ksh 中时则不然。

任何提示为什么会这样?

我在用:

SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 4
Run Code Online (Sandbox Code Playgroud)

“不工作”意味着脚本挂起(类似于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 下的目录中只保留了几个名为 cell.txt 的文件,该命令运行良好。当名称为 cells.txt 的文件增长到大约 1000 个时,该命令不会给出任何输出(挂起)。我怀疑是不是因为一些缓冲区用于输出反引号?(``) 因为 SUSE 11.3 没有任何问题,但 11.4 挂起。
  • 该命令-size +0与 find选项一起使用。它是否再次表明有关缓冲区的内容?

roa*_*ima 5

试试这个作为替代解决方案,它cat只会在找到文件时调用

find /home/peter/databases -type f -name 'cells.txt' -exec cat {} +
Run Code Online (Sandbox Code Playgroud)

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

  • @SSHegde 适用于您的版本,如果没有找到文件,`cat` 将在没有文件列表的情况下运行,默认读取 _stdin_,并等待复制您输入的任何内容。您的版本也无法处理名称包含空格的 `cat` 文件。 (2认同)