it-swarm.com.de

Was bedeutet / dev / null in einem Shell-Skript?

Ich habe mit dem Erlernen von Bash-Skripten mithilfe dieses Handbuchs begonnen: http://www.tldp.org/LDP/abs/abs-guide.pdf

Allerdings blieb ich beim ersten Drehbuch stecken:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Log files cleaned up."

Was machen die Zeilen 2 und 3 in Ubuntu (ich verstehe cat)? Gilt das nur für andere Linux-Distributionen? Nachdem ich dieses Skript als root ausgeführt habe, erhalte ich die Ausgabe Log files cleaned up., aber /var/log enthält immer noch alle Dateien.

39
rishiag

cat listet den Inhalt einer Datei auf, die nach cat zur Standardausgabe kommt, und > sendet ihn an die Datei messages und wtmp, wobei> bedeutet, dass zuerst Alle Inhalte der Datei entfernen und >> zur aktuellen Datei HINZUFÜGEN. In diesem Fall verwenden Sie>, damit die Datei leer bleibt.

Nun zum Kicker: /dev/null ist ein Gerät, das 'nichts' an die 2 Dateien hinter dem> sendet.

Es gibt einen Grund dafür: Die Datei wird NICHT vom System entfernt. Wenn Sie es rm und dann einen touch messages ausführen würden, könnten die Berechtigungen falsch sein, und wenn direkt nach dem rm etwas in die Datei geschrieben werden möchte, würde es verschwinden und einen Fehler auslösen. Abhängig davon, wie die Software erstellt wurde, kann es zum Absturz kommen.

37
Rinzwind

Unter der Annahme, dass die Befehle erfolgreich ausgeführt wurden, sind _/var/log/messages_ und _/var/log/wtmp_ noch vorhanden, aber jetzt leer .

Shell-Umleitung

_>_ ist ein Umleitungsoperator, der von der Shell implementiert wird. Ihre Syntax lautet:

_command > file_

Dies leitetcommand's Standardausgabe zufileweiter.

  • filekann auch ein Geräteknoten sein .
  • Wennfilenicht vorhanden ist, wird es als reguläre Datei erstellt.
  • Wennfilebereits als reguläre Datei existiert und nicht leer ist, wird sie überschrieben. Dies ist in der Regel bei den von Ihnen ausgeführten Befehlen der Fall, bei denen Sie die Ausgabe von _cat /dev/null_ an messages und wtmp umgeleitet haben.
  • Wennfilebereits als symbolischer Link existiert , wird das Ziel des Links verwendet.
  • Wennfilebereits als Verzeichnis vorhanden ist, erhalten Sie eine Fehlermeldung wie _bash: file: Is a directory_.

(Natürlich können diese Vorgänge aus anderen Gründen fehlschlagen, z. B. wegen fehlender Berechtigungen oder eines Dateisystemfehlers.)

Der Umleitungsoperator _>>_ ist ähnlich, aber er fügt an das Ende nicht leerer regulärer Dateienan, anstatt zu überschreiben deren Inhalt. (Ein weiterer Umleitungsoperator ist _<_. _command < file_ verwendetfilealscommands Standardeingabe .)

Das null-Gerät

_/dev/null_ ist ein einfaches Gerät (in Software implementiert und entspricht keinem Hardwaregerät im System).

  • _/dev/null_ sieht beim Lesen leer aus.
  • Das Schreiben auf _/dev/null_ bewirkt nichts: Auf dieses Gerät geschriebene Daten "verschwinden" einfach.

Häufig wird die Standardausgabe eines Befehls stummgeschaltet, indem er zu _/dev/null_ umgeleitet wird. Dies ist möglicherweise die häufigste Verwendung des Geräts null in der Shell-Skripterstellung:

_command > /dev/null_

Sie verwenden _/dev/null_ anders. _cat /dev/null_ gibt den "Inhalt" von _/dev/null_ aus, dh die Ausgabe ist leer. _> messages_ (oder _> wtmp_) bewirkt, dass diese leere Ausgabe in die Datei auf der rechten Seite des Operators _>_ umgeleitet wird.

Da messages und wtmp reguläre Dateien sind (und nicht zum Beispiel Geräteknoten), werden sie in leere Dateien umgewandelt (d. H. Geleert).

Sie können jeden Befehl verwenden, der nichts tut und keine Ausgabe erzeugt, links von _>_.

Eine alternative Möglichkeit zum Löschen dieser Dateien wäre:

_echo -n > messages
echo -n > wtmp
_

Das _-n_ -Flag ist erforderlich, oder echo schreibt ein newline Zeichen.

(Dieses funktioniert immer in bash. Und ich glaube das Standard-sh in jeder GNU/Linux-Distribution und anderen Unix-ähnlichen Systemen, die heute allgemein verwendet werden, unterstützt das Flag _-n_ in seinem echo builtin. Aber jlliagre ist richtig dass _echo -n_ sollte für ein wirklich portables Shell-Skript vermieden werden, da es nicht erforderlich ist, um zu arbeiten Warum lehrt die von Ihnen verwendete Anleitung stattdessen den _cat /dev/null_-Weg?)

Der _echo -n_-Weg ist in seinen Effekten äquivalent, aber wahrscheinlich eine bessere Lösung, da er einfacher ist.
_cat /dev/null > file_ öffnet drei "Dateien":

  • Die ausführbare Datei cat (normalerweise _/bin/cat_), eine reguläre Datei.
  • Das _/dev/null_ Gerät.
  • file

Im Gegensatz dazu öffnet _echo -n > file_ nurfile(echo ist eine eingebaute Shell).

Es ist zwar zu erwarten, dass dies die Leistung verbessert, aber das ist nicht der Vorteil - jedenfalls nicht, wenn nur ein paar dieser Befehle von Hand ausgeführt werden. Stattdessen ist es einfacher zu verstehen, was los ist.

Umleitung und der einfache Befehl (leer/leer).

Als hat jlliagre darauf hingewiesen (siehe auch jlliagres Antwort ), kann dies weiter verkürzt werden, indem einfach der Befehl links von _>_ weggelassen wird. Während Sie die rechte Seite eines _>_- oder _>>_-Ausdrucks nicht auslassen können, ist der leere Befehl gültig (es ist der Befehl, den Sie ausführen, wenn Sie nur drücken Enter Wenn Sie die linke Seite weglassen, leiten Sie nur die Ausgabe dieses Befehls um.

  • Beachten Sie, dass diese Ausgabe nicht eine neue Zeile enthält. Wenn Sie drücken Enter Bei einer Eingabeaufforderung - unabhängig davon, ob Sie etwas eingegeben haben oder nicht - druckt die Shell (interaktiv ausgeführt) eine neue Zeile, bevor der ausgegebene Befehl ausgeführt wird. Diese neue Zeile ist nicht Teil der Ausgabe des Befehls.

Das Umleiten vom leeren Befehl (anstelle von _cat /dev/null_ oder _echo -n_) sieht folgendermaßen aus:

_> messages
> wtmp_
51
Eliah Kagan

Wie bereits beantwortet, löschen diese beiden Zeilen den Inhalt der Dateien /var/log/messages und /var/log/wtmp oder erstellen sie in dem unwahrscheinlichen Fall, dass sie noch nicht vorhanden sind.

Sie basieren jedoch auf einer etablierten urbanen Legende, die /dev/null "paranormale" Kräfte verleiht.

Es hat eigentlich keine, also ist cat /dev/null eine Verschwendung von Tastenanschlägen, Zeit und CPU-Zyklen, da es absolut nichts ausgibt. Eliah Kagans Antwort schlägt den besseren Ansatz vor, der stattdessen echo -n verwendet. Dies ist besser, aber nicht portierbar für einige Shells/Betriebssysteme, in denen die Zeichenfolge '-n' in diese Dateien eingefügt werden kann.

Sie können noch weiter gehen und diese Befehle durch die portablen und einfacheren ersetzen:

cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."

Bei den meisten Shells (aber nicht den auf csh basierenden) können Sie noch weiter gehen und den No-Op-Befehl ':' entfernen:

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
12
jlliagre

> ist ein Umleitungsoperator für die Ausgabe. Die Ausgabe des Befehls wird in die nachstehende Datei umgeleitet, anstelle des Standardausgabegeräts, und der Inhalt der Datei wird abgeschnitten oder überschrieben.

zum Beispiel ls -l > demo.txt. Nach dem Ausführen dieses Befehls enthält "demo.txt" den Ausgabebefehl ls -l.

Was ist nun das nächste? /dev/null./dev/null ist die Nulldatei Ist eine spezielle Datei, die nichts enthält.

Also, wenn Sie Befehle ausführen

cat /dev/null > messages
cat /dev/null > wtmp

es löscht den Inhalt der Dateien "messages" und "wtmp" durch Überschreiben mit dem EOF-Zeichen (End Of File).

Hier löschen Sie also nicht das Verzeichnis /var/log, sondern den Inhalt dieser beiden Dateien.

5
g_p

/ dev/null ist wie ein schwarzes Loch. In/dev/null vorgenommene Schreibvorgänge werden verworfen. In diesem Skript verwenden sie/dev/null, um die Nachrichtenprotokolldatei zu leeren.

Sonst hätten sie einfach gebraucht.

 > /var/log/messages.

Es gibt andere Möglichkeiten, den Inhalt einer Datei zu leeren.

Mögen.

     truncate  -s  0  /var/log/messages
     cp  /dev/null  /var/log/messages

Die Verwendung von ">" oder "/ dev/null" ist jedoch der effizienteste Weg.