2つのLinuxシステムが同じ構文を使用するコマンドを使用して異なる動作をするのはなぜですか?

2つのLinuxシステムが同じ構文を使用するコマンドを使用して異なる動作をするのはなぜですか?

私は2台の機械を使用しています。Red Hat Enterprise Linux AS リリース 3 (Taroon Update 2) (私は/ etc / * - releaseで確認します)。

私は彼らが同じ基本シェルであるps -p $$bashを使用していることを確認しました。

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

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

最初のシステムはワイルドカードを拡張しているように見え、エラーが発生します。

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

次のように区切られた 2 つの qoutes の間にパターンを生成するか、\"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 failureglob"は、ワイルドカードの一致に失敗したコマンドの実行を拒否します。

findのワイルドカード拡張に依存する必要があるため、拡張を防ぐには、次のパターンをシェルから引用する必要があります。

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

(一重引用符に注意してください)。 0個または1個のファイルに対しては機能しますが、2個以上のファイルについてはコマンド構文が壊れて文句を言います。これが同僚が言ったことです。アルセグ。 「set -f」は拡張機能を完全に無効にします。これは良い診断方法ですが、将来の移動のために水中熊手を提供することができます。見積もりが簡単になりました:)

答え2

2番目のシステムのホームディレクトリには一致するファイルがないようですが、1番目のサーバーsftp_bcs_report_*.logにはこれらのファイルが複数あります。使用時にfindスキーマは常に引用する必要があります。

関連情報