Die folgenden Befehle scheinen ungefähr gleichwertig zu sein:
read varname
varname=$(head -1)
varname=$(sed 1q)
Ein Unterschied ist, dass read
eine Shell eingebaut ist head
und sed
nicht.
Gibt es außerdem einen Unterschied im Verhalten zwischen den drei?
Meine Motivation ist es, die Nuancen der Shell und der wichtigsten Dienstprogramme wie besser zu verstehen head,sed
. Wenn die Verwendung head
beispielsweise ein einfacher Ersatz für ist read
, warum gibt read
es sie dann als integrierte Funktion?
read
Parameter analysiert werden können, die durch das interne Feldtrennzeichen getrennt sind$IFS
. @ rameshsstrace
Trick ist auch eine großartige Möglichkeit, Unterschiede zu analysieren.Zum einen können Sie Text mit Lesen analysieren und nicht nur eine ganze Zeile
quelle
read
genau, Sie analysieren es mit$IFS
.IFS=:; set -- ${0+foo:bar:baz}; echo "$2"
erreicht das gleiche - und es erfordert keine|pipes
oder geklonte Unterschalen. Oder :IFS=:; printf %.0s%s%.0s\\n ${0+foo:bar:baz}
. Sonst:echo foo:bar:baz | { IFS=:; set -- $(cat); echo "$2"; }
wenn du das Rohr haben musst. In jedem Fall ist die Aufteilung ein Ergebnis Ihrer Einstellung$IFS
; nicht unbedingt, dass duread
es.read
weist die geteilten Teile Variablen zu.Builtins sind vorhanden, um die Systemaufrufe schneller zu machen. Daher glaube ich, dass der
read
Befehl als integrierter Bestandteil vorhanden ist, um effizienter zu sein.Zitat von hier ,
Nun möchte ich, dass dies selbst experimentiert wird, damit Sie verstehen, warum
read
es als eingebaute Shell vorhanden ist.Normalerweise kann man keine
strace
Shell-Builds verwenden. Es gibt jedoch auch hierfür eine Problemumgehung. Dies wird in dieser Antwort ziemlich genau erklärt .stty -echo
.cat | strace bash > /dev/null
.strace
da sie ziemlich groß ist.quelle
read
eingebaute ist/bin/sh
bereits vorhandenhead
und wahrscheinlichsed
.read
ist ein eingebautes Gerät und überspringt den Aufwand und die Buchhaltung, die mit dem Starten eines neuen Prozesses verbunden sind.Sie können schreibgeschützt
varname
in einem Shell-Skript verwenden, aber zwei andere können Sie verwenden, ohne ein Shell-Skript zu schreiben.Zum Beispiel:
Sie können
varname=$(head -1)
undvarname=$(sed 1q)
einfach als Befehl im Terminal verwenden, aber Sie müssen auch Ihr Argument angeben, dh welche Dateien die oberste Zeile sind, auf die Sie sich beziehen, dhvarnam=$(head -1 file1)
.quelle
read varname
außerhalb eines Shell-Skripts verwenden. Versuch es! Es gibt nur sehr wenige Dinge, die Sie in einem Skript tun können, die Sie nicht an einer Eingabeaufforderung in der Sh-Familie "sh" ausführen können (ob sie sehr nützlich sind, ist eine andere Sache).