web-dev-qa-db-ja.com

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にファイル名がパラメーターとして指定されていない場合の動作のようなもの)

Kshスクリプトでは、find /home/peter/databases -name "cells.txt"の出力は空ではありません。この場合、スクリプトは見つかったファイルを一覧表示できます。しかし、上記のように逆引用符を使用して見つかったファイルをキャットしようとすると、問題が発生します。

Findコマンドでリストされたファイルは1000近くありますが、それらのほとんどは空です。上記のcatコマンドはshでは機能しますが、kshでは機能しません。

  • 名前空間を含むファイルはありません。
  • ファイルcells.txtの内容は、空または単一のステートメントです。
  • コマンド(cat `find/home/peter/databases -name" cells.txt "`)は、/ home/peter/databasesの下のファイルの数が少ない場合は正常に機能します。この場合、ファイルの数は1000です。
  • 同じコマンドがSUSE11.3kshで機能しています。しかし、SUSE11.4で実行すると失敗します。
  • / home/peter/databasesの下のディレクトリにcells.txtという名前のファイルをいくつか保存しました。コマンドは完全に正常に機能しています。 cells.txtという名前のファイルが約1000の数に増えると、コマンドは何も出力しません(ハングします)。出力のバッククォートに使用されているバッファが原因だと思いますか? ( ``)SUSE 11.3には問題はありませんが、11.4がハングするためです。
  • このコマンドは、オプション-size +0とfindを使用して機能しました。バッファについて何かをもう一度示していますか?
1
SS Hegde

スクリプトは、findコマンドでゼロのファイルサイズを無視することによって機能しました。 (-サイズ+0)

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

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

0
SS Hegde

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

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

(お使いのバージョンのfindが末尾の+を理解できない場合は、2文字の\;に置き換えてください)

5
roaima