同じ構文のコマンドで 2 台の Linux マシンが異なる動作をするのはなぜですか?

同じ構文のコマンドで 2 台の Linux マシンが異なる動作をするのはなぜですか?

私は2台のマシンを使用していますが、どちらもRed Hat Enterprise Linux AS リリース 3 (Taroon アップデート 2) ( /etc/*-release で確認しました)。

同じデフォルトのシェルps -p $$(bash) を使用していることを確認しました。

ワイルドカードパターンを使用して find コマンドを実行しようとしました: find path -name pattern -type f -ctime +3

パターンにはワイルドカードとして * 文字が含まれます。

最初のマシンはワイルドカード文字を展開し、エラーを引き起こしているようです。

find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression

そして、パターンを 2 つの区切り引用符で囲むか、スクリプト内で\"sftp_bcs_report_*.log\"使用してワイルドカードの展開を抑制する必要があります。set -f

他のマシンでは、そのような問題は発生しません。何かご存知ですか?

答え1

デフォルトでは、ファイルがワイルドカードに一致する場合はシェルはワイルドカードを展開しますが、一致しない場合は展開しません。たとえば、touch /tmp/111; touch /tmp/11*これを実行すると、/tmp/111 に mtime が作成されて更新されますが、/tmp が空でも呼び出すと、touch /tmp/11*/tmp に "11*" という名前のファイルが作成されます。

これはシェルのかなり奇妙な機能です。中間関数として特別なハックがなければ、適切な展開ができない場合があります。現在のシェルのほとんどは、典型的なケースのために特別なオプションを作成します。たとえば、bash の「shopt -s failglob」は、ワイルドカードの一致が失敗したコマンドの実行を拒否します。

find のワイルドカード拡張に頼る必要があるため、このようなパターンはシェルの拡張に対して引用符で囲む必要があります。

find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7

(シングルクォートに注意してください)。ファイルが 0 個または 1 個の場合は動作しますが、ファイルが 2 個以上の場合はコマンド構文が壊れてエラーが発生します。これは同僚が言っていることです。アルセージュ. 「set -f」は拡張を完全に無効にします。これは診断には良い手段ですが、将来の移動のために水中レーキを与える可能性があります。引用符はよりシンプルです:)

答え2

2 番目のマシンの開始ディレクトリには一致するファイルが存在せずsftp_bcs_report_*.log、最初のサーバーにはそのようなファイルが複数存在するようです。 を使用する場合はfind、パターンを常に引用符で囲む必要があります。

関連情報