Ich weiß, cat
dass dies möglich ist, aber der Hauptzweck besteht darin, Inhalte zu verketten und nicht nur anzuzeigen.
Ich weiß auch über less
und Bescheid more
, aber ich suche etwas Einfaches ( keinen Pager ), das nur den Inhalt einer Datei an das Terminal ausgibt und das speziell dafür gemacht ist, wenn es so etwas gibt.
cat
verkettet.a+b+c
zwei Additionen ausgeführt, und beim Computinga
wird nichts hinzugefügt. Ebenso beinhaltet das Ausführencat f
keine Verkettung (obwohl dies das einzige ist, was "Verketten einer Sequenz einer Datei" bedeuten könnte).cat
liest eine Datei und schreibt eine andere Datei (Stream), aber das bedeutet nicht, dass es sich um eine Verkettung handelt. Solltest du vielleicht meinen, dasscat f
das tatsächlich socat - f
ist, ist das einfach nicht wahr.cat
sollte eigentlich verketten (cat file1 file2
verkettet beide Dateien zu stdout). Der Nebeneffekt ist jedoch, dass bei nur 1 Datei als Argument diese eine Datei an stdout ausgegeben wird (egal wo, entweder auf Ihrem Terminal oder auf etwas umgeleitet). Es wurde also kein anderer Befehl erstellt, um nur auf stdout auszugeben, wie ercat
existierte und es einfach erlaubte. Deshalb möchten Sie verwendencat
.Antworten:
Das offensichtlichste ist
cat
. Schauen Sie sich aber auchhead
und antail
. Es gibt auch andere Shell utillities eine Datei Zeile für Zeile drucken:sed
,awk
,grep
. Diese dienen jedoch dazu, den Dateiinhalt zu ändern oder in der Datei zu suchen.Ich habe ein paar Tests durchgeführt, um abzuschätzen, welche die effektivste ist. Ich laufe alle durch, um
strace
zu sehen, welche die wenigsten Systemaufrufe gemacht haben. Meine Datei hat 1275 Zeilen.awk
: 1355 Systemaufrufecat
: 51 Systemaufrufegrep
: 1337 Systemaufrufehead
: 93 Systemaufrufetail
: 130 Systemaufrufesed
: 1378 SystemaufrufeWie Sie sehen,
cat
ist es das schnellste und effektivste Programm , auch wenn es zum Verketten von Dateien entwickelt wurde.sed
,awk
undgrep
druckte die Datei Zeile für Zeile, weshalb sie mehr als 1275 Systemaufrufe haben.quelle
Der Zweck von
cat
ist genau das, eine Datei zu lesen und auf stdout auszugeben.quelle
cat --help
sagt „Concatenate Datei (en) oder Standardeingabe auf Standardausgabe“. Ich möchte nichts verkettenreadlink /dev/fd/1
zum Beispiel - Sie sollten Ihre tty Namen dort bekommen , wenn bei einer Standardaufforderung. Sie müssen also die Eingabe mit der Ausgabe verknüpfen.Zuerst
cat
schreibt auf die Standardausgabe, die nicht unbedingt ein Terminal ist, wenn auchcat
als Teil eines Befehls in einer interaktiven Shell eingegeben wurde. Wenn Sie wirklich etwas zum Schreiben in das Terminal benötigen, selbst wenn die Standardausgabe umgeleitet wird, ist dies nicht so einfach (Sie müssen angeben, welches Terminal verwendet wird, und es gibt möglicherweise nicht einmal ein Terminal, wenn der Befehl über ein Skript ausgeführt wird) könnte (ab) die Standardfehlerausgabe verwenden, wenn der Befehl nur ein Teil einer Pipeline ist. Aber da Sie angegeben haben, dass diescat
tatsächlich der Fall ist, haben Sie wahrscheinlich nicht nach einer solchen Situation gefragt.Wenn Sie beabsichtigen, das, was auf die Standardausgabe geschrieben ist, in eine Pipeline zu senden, ist using
cat
für den Useless Use of Cat Award berechtigt , dacat file | pipeline
(wopipeline
für eine Pipeline steht) dies effizienter durchgeführt werden kann<file pipeline
. Aber auch aus Ihrer Formulierung schließe ich, dass dies nicht Ihre Absicht war.Es ist also nicht so klar, worüber Sie sich Sorgen machen. Wenn die Eingabe
cat
zu lang ist, können Sie einen ein- oder zweistelligen Alias definieren (es gibt noch einige solche Namen, die in Standard-Unix nicht verwendet werden). Wenn Sie jedoch befürchten,cat
unnötige Zyklen zu verbringen, sollten Sie dies nicht tun .Wenn es ein Programm gäbe
null
, das keine Argumente akzeptiert und nur die Standardeingabe in die Standardausgabe kopiert (das neutrale Objekt für Pipelines), könnten Sie tun, was Sie wollen<file null
. Es gibt kein solches Programm, obwohl es einfach zu schreiben wäre (ein C-Programm mit nur einer einzeiligenmain
Funktion kann den Job erledigen), aber ein Aufrufcat
ohne Argumente (odercat -
wenn Sie explizit sein möchten) macht genau das.Wenn es ein
nocat
Programm gäbe , das genau ein Dateinamenargument verwendet, versucht, die Datei zu öffnen, sich darüber beschwert, wenn dies nicht möglich ist, und andernfalls von der Datei auf die Standardausgabe kopiert, dann ist dies genau das, wonach Sie gefragt haben. Es ist nur geringfügig schwieriger zu schreiben alsnull
, da die Hauptarbeit darin besteht, die Datei zu öffnen, zu testen und möglicherweise zu beschweren (wenn Sie akribisch sind, möchten Sie möglicherweise auch einen Test einfügen, bei dem es genau ein Argument gibt, und sich ansonsten beschweren). Aber wieder einmalcat
, jetzt mit einem einzigen Argument versehen, ist genau dies der Fall, sodass keinnocat
Programm erforderlich ist .nocat
Warum sollten Sie nach dem erfolgreichen Schreiben des Programms bei einem einzigen Argument stehen bleiben? Das Einwickeln des Codes in eine Schleifefor(;*argp!=NULL;++argp)
ist wirklich kein Aufwand, fügt der Binärdatei höchstens ein paar Maschinenanweisungen hinzu und vermeidet, sich über eine falsche Anzahl von Argumenten beschweren zu müssen (was viel mehr Anweisungen erspart). Voilà ist eine primitive Version voncat
verketteten Dateien. (Um ehrlich zu sein, müssen Sie es ein wenig optimieren, damit es sich ohne Argumente so verhältnull
.)Natürlich
cat
fügten sie im realen Programm ein paar Schnickschnack hinzu, weil sie es immer tun. Aber das Wesentliche ist, dass der Aspekt der "Verkettung" überhauptcat
keinen Aufwand kostet, weder für den Programmierer noch für die Maschine, die ihn ausführt. Die Tatsache, dass das Nichtvorhandensein solcher Programmecat
subsumiertnull
undnocat
erklärt. Vermeiden Sie die Verwendungcat
eines einzelnen Arguments, wenn das Ergebnis in eine Pipeline eingeht, aber wenn es nur zum Anzeigen von Dateiinhalten auf dem Terminal verwendet wird, gibt selbst die von mir verlinkte Seite zu, dass dies eine nützliche Verwendung istcat
, zögern Sie also nicht.Sie können testen , die
cat
wirklich durch eine einfache Schleife um eine hypthetical implementiertnocat
Funktionalität, durch den Aufrufcat
mit mehreren Dateinamen , unter denen ein ungültigen Name, nicht in der ersten Position: anstatt sofort beschwert , dass diese Datei nicht existiert,cat
zuerst die vorhergehenden Dumps gültige Dateien und beschwert sich dann über die ungültige Datei (zumindest verhält sich meine Katze so).quelle
Unter
zsh
VersuchIch glaube, es ist der kürzeste Weg, um eine Datei zu drucken. Es wird 'hidden' verwendet
cat
(odermore
wenn stdout ein Terminal ist), aber der zum Drucken verwendete Befehl wird durch eineREADNULLCMD
Variable gesteuert , die Sie sicher direkt durch den Befehlsnamen oder sogar durch eine Funktion überschreiben können. So drucken Sie beispielsweise Dateien mit Zeilennummerierung:quelle
POSIX definiert Katze als:
Ich denke, verketten bedeutet hier, Dateien nacheinander zu lesen .
quelle
Ich weiß, dass dies eine Vergangenheitsfrage ist. Technisch gesehen ist das Ausdrucken des Inhalts einer Datei
stdout
als Verkettungcat
semantisch angemessen. Vergessen Sie nicht, dassprintf
semantisch Daten formatiert und gedruckt werden sollen. Bash bietet auch eine Syntax zum Umleiten der Eingabe und Ausgabe von Dateien. Eine Kombination von diesen könnte dies erzeugen:quelle
cat file.txt
es sich um einen Kreisverkehr handelt, entspricht der angezeigte Befehl nicht dem Befehl , da alle nachgestellten Zeilenumbrüche entfernt werden (der$(...)
tut dies).Verwenden von integrierten
bash
Funktionen und Vermeiden der Erstellung von Unterprozessen:IFS
wird nur auf denread
Befehl angewendet , sorgen Sie sich also nicht um Ihre globalenIFS
Änderungen.Schleife erforderlich, um Nullzeichen zu verarbeiten (danke an Stéphane Chazelas).
Diese Methode eignet sich nicht für große Dateien, da der Dateiinhalt zuerst in die Variable (also in den Speicher) gelesen wird. Übrigens habe ich versucht, eine 39-MB-Textdatei auf diese Weise zu drucken, und die Bash-Speichernutzung hat 5 MB nicht überschritten.
Es ist auch verdammt langsam und CPU ineffizient: Für die gleiche 39M-Datei dauerte es ~ 3 Minuten bei 100% Auslastung eines einzelnen Kerns.
Für große Dateien oder Binärdateien besser zu bedienen
cat '/path/to/file'
oder auchdd if='/path/to/file' bs=1M
wenn möglich.quelle
pv -q
welche Linux-Versionsplice()
welche für einige Arten von stdin / stdout verwenden kann, um die Leistung zu verbessern.Nur als Demonstration können Sie tun
quelle