Kopf hängt oder endet nicht unter Linux

910
jcarpio

Ich verwende (uname -a) Linux ip-xxxx 2.6.21.7-2.fc8xen-ec2-v1.0 # 1 SMP Di 1. Sep 10:25:30 EDT 2009 x86_64 GNU / Linux.

Ich habe ein Skript, foo.sh mit 100 Zeilen Code und wenn ich renne

Kopf -n 5 foo.sh

der Befehl "hängt" nur, bis ich Strg-C drücke.

Mann Kopf

gibt nicht viel einblick.

Der Pfad zum Kopf (über den) lautet / usr / bin / head

Ich bin SSH in den Server, wenn das einen Unterschied macht.

Meine Shell ist / bin / bash.

Eine Problemumgehung zu verwenden

sed 5q foo.sh

funktioniert super, aber ich hätte gerne eine Antwort auf diese Frage. Vielen Dank an alle.

1
what does `head --version` report? Does `head -n 5 < foo.sh` work as expected? If so, after `head -n 5 foo.sh`, does typing a few lines of random text followed by ctl-D cause the first 5 lines of your random text to be echoed? rici vor 10 Jahren 0
@rici `head --version` hangs, too! `head -n 5 < foo.sh` doesn't work. I tried typing anyway and my characters get echoed immediately. jcarpio vor 10 Jahren 0
Wenn "head --version" hängt (und Sie keine anderen Probleme haben, "tail" oder ähnliche Programme funktionieren usw.), dann ist dies, wie @rici sagte, fast sicher kein normaler "head", sondern etwas anderes. terdon vor 10 Jahren 0

1 Antwort auf die Frage

2
rici

Ich wollte vorschlagen, dass Ihr headSymlink ist busybox, aber auch mit busybox wird es funktionieren head -n 5 < foo.sh. (Tatsächlich funktioniert die, mit der ich ausprobiert habe head -n 5 foo.sh, aber es gibt möglicherweise Versionen, die dies nicht tun.) Trotzdem scheint es, dass die headauf Ihrem Rechner nicht Standard ist head. Vielleicht ist es ein Alias ​​oder eine Shell-Funktion.

Kleiner Hinweis: Es ist wichtig (wenn auch nicht immer offensichtlich), zwischen einem "hängenden" Programm und einem Programm zu unterscheiden, das einfach auf Benutzereingaben wartet. Ihre wartet auf Benutzereingaben. Das ist anders als zum Beispiel sleep 3600oder for ((i=1;i<100000000;++i)); do :; done.

Hier sind einige Dinge, die Sie ausprobieren können:

$ type head head is aliased to `echo Surprise\!' #...  $ type head head is a function head ()  {  echo surprise\! } # ...  $ type head head is hashed (/usr/local/bin/head) $ file /usr/local/bin/head /usr/local/bin/head: POSIX shell script, ASCII text executable  $ type head head is hashed (/usr/local/bin/head) $ file /usr/local/bin/head /usr/local/bin/head: symbolic link to `/bin/busybox' 
Ah, der Dateikopf gibt diese Informationen. `ip-xxxx: / usr / bin # -Datei / usr / bin / head / usr / bin / head: ELF-ausführbare 64-Bit-LSB-Datei, x86-64, Version 1 (SYSV), dynamisch verknüpft (verwendet freigegebene Bibliotheken), z GNU / Linux 2.6.8, entfernt ` jcarpio vor 10 Jahren 0
@jcarpio: Meine Güte, Ihr Linux-Kernel hat gerade seinen neunten Geburtstag gefeiert! Hat "hash head" gezeigt, dass es diesen Pfad benutzt? Das Untersuchen von Kuriositäten wie diese sollte übrigens nicht von einem Root-Konto aus erfolgen. Wenn ein Angreifer in Ihr System eingedrungen wäre und Bösewichte über Ihre Standard-Dienstprogramme gespritzt hätte (oder einen schlecht konfigurierten $ PATH ausnutzte), würde das Ausführen dieser als root in ihre Hände spielen. rici vor 10 Jahren 0
well, hash head doesn't give anything. at this point, the sed workaround seems fine. thanks for the help! jcarpio vor 10 Jahren 0