catコマンドはシェルスクリプトでは機能しません

catコマンドはシェルスクリプトでは機能しません

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では無効です。

  • 名前空間を含むファイルは存在しません。
  • cell.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でこのオプションを使用します。バッファについてもう一度教えてください。

答え1

catファイルが見つかった場合にのみ呼び出す代替ソリューションとしてこれを試してください。

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

(あなたのバージョンがfind末尾を認識しない場合は、+2文字に置き換えてください\;。)

答え2

スクリプトは find コマンドでゼロファイルサイズを無視して動作します。 (-サイズ+0)

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

他の解決策にも同意します。しかし、私の質問は、kshがcatを処理できない理由がバッファサイズ(バックティック出力)のためであるかどうかを見つけることでしたので、答えを投稿しました。 @wurtel:ありがとう。ご提案で問題を解決しました。

関連情報