Warum verhalten sich zwei Linux-Rechner bei Befehlen mit derselben Syntax unterschiedlich?

Warum verhalten sich zwei Linux-Rechner bei Befehlen mit derselben Syntax unterschiedlich?

Ich verwende 2 Maschinen, die beideRed Hat Enterprise Linux AS Version 3 (Taroon Update 2) (Ich überprüfe es in /etc/*-release).

Ich habe überprüft, dass sie dieselbe Standard-Shell verwenden ps -p $$, nämlich Bash.

Ich habe versucht, einen Suchbefehl mit Platzhaltermuster auszuführen: find path -name pattern -type f -ctime +3

und das Muster enthält das Zeichen * als Platzhalter.

Die erste Maschine scheint das Platzhalterzeichen zu erweitern und einen Fehler zu verursachen:

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

und ich muss entweder das Muster zwischen zwei abgegrenzten Anführungszeichen einfügen, z. B.: \"sftp_bcs_report_*.log\"oder es set -fim Skript verwenden, um die Platzhaltererweiterung zu unterdrücken.

Auf der anderen Maschine gibt es dieses Problem nicht. Haben Sie eine Idee?

Antwort1

Standardmäßig erweitern Shells Platzhalter, wenn eine Datei mit ihnen übereinstimmt, lassen sie aber unerweitert, wenn keine Übereinstimmung vorliegt. Wenn Sie touch /tmp/111; touch /tmp/11*dies beispielsweise ausführen, wird mtime auf /tmp/111 erstellt und dann aktualisiert. Wenn /tmp jedoch leer ist, Sie es aber aufrufen, touch /tmp/11*erhalten Sie eine Datei mit dem Namen „11*“ in /tmp.

Dies ist eine ziemlich seltsame Funktion von Shells. Manchmal ist eine ordnungsgemäße Erweiterung ohne spezielle Hacks als Zwischenfunktion nicht möglich. Die meisten aktuellen Shells entwickeln spezielle Optionen für typische Fälle. Beispielsweise verhindert „shopt -s failglob“ in Bash die Ausführung von Befehlen, bei denen die Platzhalterübereinstimmung fehlschlägt.

Man sollte sich auf die Platzhaltererweiterung von find verlassen, daher sollte das folgende Muster bei der Erweiterung in der Shell in Anführungszeichen gesetzt werden:

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

(beachten Sie die einfachen Anführungszeichen). Mit null oder einer Datei funktioniert es, aber bei zwei oder mehr Dateien wird die Befehlssyntax beschädigt und es kommt zu Beschwerden - das sagt ein KollegeArcege. Ihr „set -f“ deaktiviert die Erweiterung vollständig – es ist zwar eine gute Maßnahme zur Diagnose, kann aber bei einem späteren Umzug zu Unterwasser-Rechen führen. Anführungszeichen sind einfacher:)

Antwort2

sftp_bcs_report_*.logKlingt, als ob es im Startverzeichnis auf dem zweiten Rechner keine passende Datei gibt und auf dem ersten Server mehr als eine solche Datei. Bei der Verwendung findsollten Muster immer in Anführungszeichen gesetzt werden.

verwandte Informationen