Ich vergess immer das nicht allesin OSX POSIX-kompatibel ist. $() ist die POSIX-Variante für "``".
Abarbeitung einer Kommandozeile
Eine Kommandozeile wird von der Shell zunächst umfassend in folgenden Schritten analysiert:
1. Zerlegung der Kommandozeile anhand von \Newline-, Newline-, Tabulator- und Leerzeichen
2. Parameter-Ersetzung und Auswertung von Shell-Variablen-Zuweisungen (Erläut. später)
3. Kommandosubstitution (Erläut. später)
4. weitere Zerlegung der bisher entstandenen Teile anhand von Trennzeichen
5. Auswertung vorhandener Ein-/Ausgabe-Umlenkungen (siehe nächsten Abschnitt)
6. Dateinamen-Expandierung (d.h. Auflösung evtl. vorhandener Jokerzeichen)
http://cs.unitbv.ro/~costel/solg/unix_4.htm
Wie du siehst ist der "Anfängerfehler" kein Fehler da Kommandosubstitution vor der Umlenkung und somit vor dem Öffnen des filedescriptors für die Ausgabe stattfindet. (bash)
"useless use of cat" von mir aus, es funktioniert aber. der Aufwand für die Platte dürfte aber der gleiche sein wie beim arbeiten mit einer temporären datei.
Man kann meines erachtens nach nicht billig eine Zeile am Anfang einfügen. Das zieht immer ein Verschieben aller anderen Zeilen nach sich was sich bei großen Dateien dann wohl wirklich negativ auswirken dürfte.
Sinnvoller dürfet es sein am Ende anzufügen und dann beim Auswerten rückwärts zu arbeiten.
"tac" ist da ganz praktisch wenn vorhanden.
z.b. die letzen 20 zeilen rückwärts "tail -n20 file| tac".
Kann man bestimmt unter OSX nachinstallieren.