Wenn die Ausgabe eines Befehls in eine Datei umgeleitet wird, wird die Ausgabedatei von der Shell erstellt oder abgeschnitten, bevor der Befehl ausgeführt wird, irgendeine Idee, was cat foo> foo tut?In UNIX was "cat file1> file1 tut?"
Antwort
In allen Fällen wird die Datei abgeschnitten. Das liegt daran, dass die Umleitung von der Shell gehandhabt wird, die die Datei zum Schreiben vor dem Aufruf des Befehls öffnet.
cat foo > foo
Die Verkürzungen Shell und öffnet foo zum Schreiben, setzt stdout in die Datei, und dann die exec ["cat", "foo"]
.
GNU Katze ist klug und weigert sich, eine Datei an sich selbst umzuleiten. Dazu überprüft er das Device/Inode-Paar auf den Deskriptoren der Eingabe- und Ausgabedatei. Sie können die wunderbaren Low-Level-Details in src/cat.c lesen. Es druckt eine Nachricht und wird beendet.
BSD Katze hat keine solche Sicherheit, aber da die Datei bereits abgeschnitten wurde, gibt es nichts zu lesen, nichts zu schreiben, und es wird anhalten.
Sie können die Dinge etwas aufpeppen, indem Sie sie anhängen und nicht abschneiden.
echo hello > foo
cat foo >> foo
Jetzt ist alles gleich, außer dass die Shell die Datei zum Anhängen öffnet, anstatt sie zu kürzen.
GNU Katze sieht, was Sie tun und stoppt; Die Datei ist unberührt.
BSD cat geht in eine Schleife und hängt die Datei an sich an, bis die Festplatte voll ist.
Und deshalb ist Mac auf BSD gebaut. –
Die Datei wird zuerst abgeschnitten und dann gelesen, sodass dieser Befehl die Datei abschneidet.
Als ich versuchte, ihn auszuführen ich diese Warnung bekam:
Katze: test.txt: Eingabedatei Ausgabedatei
Welche "Katze" hast du auf der Plattform? 'cat foo> foo' ergibt für mich eine leere' foo' Datei. – birryree
auf Fedora 13 das ist, was ich sehe,
cat foo > foo
cat: foo: input file is output file
Wenn foo
etwas zuvor enthielt, ist es weg.
Shell wird gestutzt, cat
offenbar prüft eine benannte Parm, aber nicht überprüfen gegen stdin
wie unten und es gelingt ihm immer:
$ uname -a
Linux bar 2.6.18-164.15.1.el5PAE #1 SMP Wed Mar 17 12:14:29 EDT 2010 i686 i686 i386 GNU/Linux
$ dd if=/dev/urandom of=foo bs=1024 count=4
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.00334456 seconds, 1.2 MB/s
$ od -c foo |head -2
0000000 U 371 003 z 224 334 z K 236 221 k < c 256 !
0000020 % % 256 V \ 005 , 254 X 202 330 004 222 " 037 226
$ cat <foo >foo && od -c foo
0000000
Vielen Dank für Ihre Antworten. Sie waren alle hilfreich. – HelloWorld
- 1. Wie kann man mit UNIX find suchen (file1 ODER file2)?
- 2. Was bedeutet Befehl cat/etc/group mean
- 3. unix - Ausführen der Ausgabe mit "cat foo" -Befehl
- 4. Wie man literalen Text zum Unix 'cat' Befehl hinzufügt
- 5. Was eine Transaction tut wirklich tut
- 6. Wofür steht `cat-file` in git?
- 7. shell - cat - Zusammenführen von Dateien in eine große Datei
- 8. PG_restore. Was tut es?
- 9. Was Buchhaltung tut?
- 10. Was $ q.defer() wirklich tut?
- 11. Was Python string.maketrans tut ("", "")
- 12. Was std :: _ lockit tut?
- 13. Was Application.Run() tut?
- 14. Was die exec.skip tut tut in Maven Befehl
- 15. Entspricht in git von "hg cat" oder "svn cat"
- 16. Unix: Was macht Katze an sich?
- 17. MoreLinq Erwerben. Was tut es?
- 18. Was tut RegExp 1 $ tun
- 19. index.js nicht was index.ts tut
- 20. Was genau "config.assets.debug" Einstellung tut?
- 21. Unix-Shell-scripting - mehrere Datei concatenate
- 22. Tut Scala Async alles, was Clojures core.async tut?
- 23. Was eigentlich $ Funktion in Haskell tut?
- 24. Was tut die Zuweisung in rspec-rails?
- 25. Was genau tut Attach() in Entity Framework?
- 26. Was Doppel Doppelpunkt in RewriteCond tut?
- 27. was tut yield_task_fair() tun in Linux Scheduler
- 28. Was 0x0 tut zeigen in der Anweisung
- 29. Verstehen, was "Typ" Schlüsselwort in Scala tut
- 30. Können Sie überschreiben, was == in Javascript tut?
Ich vermute, dies wäre ein sehr guter Test für das Verhalten der Shell. –