Nimm die Befehle doch mal einzeln.
$ dirname was/ist/denn/hier/los
was/ist/denn/hier
dirname mit einem Argument gibt eine Zeile aus. Wenn keine Leerzeichen im Pfad sind, auch nur ein Wort.
$ dirname was/ist/denn/hier/los | head -n 1
was/ist/denn/hier
head -n 1 gibt die erste Zeile aus. Da dirname sowieso nur eine Zeile ausgegeben haben kann (wenn man mal von Zeilenumbrüchen in Dateinamen absieht), bleibt die Ausgabe unverändert.
Das echo danach gibt dann auch genau das aus, was dirname ausgegeben hat. Wenn du hier mehr als eine Zeile Ausgabe bekommst, dann ist es die for-Schleife drum herum, die eben mehrfach durchlaufen wird.
Ich will doch einfach nur wissen wieso hier head nicht so geht wie es soll.
Es kann keiner beantworten weil kein Mensch weiß, was du hier für ein Ergebnis erwartest.
Und dein Beispielscript ist soweit verfälscht daß man es da auch nicht herauslesen kann.
Das Problem mit head in einer Schleife hatte ich schon ein paar mal und es irgendwie anders hingebogen aber nie verstanden wieso es nicht geht.
Irgendein grundlegendes Missverständnis scheint vorzuliegen, ich weiss leider nicht welches.
Mit 'set -x' kannst du die Shell in den Debugmodus kicken, da wird jeder ausgeführte Schritt einzeln ausgegeben. Manchmal hilft das mit dem Verständnis. Ansonsten eigene Debugmeldungen nach Bedarf einbauen.
Eine Anmerkung noch zum echo $a
. Hast du vielleicht Sternchen im Dateinamen? Oder tatsächlich for x in "*"
geschrieben?
$ a="*"
$ echo $a
datei1 datei2 datei3 datei4
$ echo "$a"
*
Das wär dann ein klassischer Fall von - falsch gequotet.
Aber das ist jetzt wild geraten denn in deinem Beitrag steht das so nicht drin...
Bei Variablen gehören meistens "" drum herum. Bei * meistens nicht, wenn es für "alle Dateien" stehen soll.