head si blocca o non termina su Linux


1

Sto usando (uname -a dice) Linux ip-xxxx 2.6.21.7-2.fc8xen-ec2-v1.0 # 1 SMP mar 1 set 10:25:30 EDT 2009 x86_64 GNU / Linux.

Ho uno script, foo.sh con 100 righe di codice e quando corro

head -n 5 foo.sh

il comando "si blocca" finché non premo Ctrl-C.

testa di uomo

non fornisce molte informazioni.

Il percorso verso head (tramite il quale) è / usr / bin / head

Sono SSH nel server se questo fa la differenza.

La mia shell è / bin / bash.

Una soluzione alternativa da usare

sed 5q foo.sh

funziona alla grande, ma vorrei una risposta a questa domanda. Grazie a tutti.


cosa head --versionsegnala? Funziona head -n 5 < foo.shcome previsto? In tal caso, dopo head -n 5 foo.sh, digitando alcune righe di testo casuale seguite da ctl-D si fa eco alle prime 5 righe del testo casuale?
rici,

Anche @rici si head --versionblocca! head -n 5 < foo.shnon funziona Ho provato comunque a scrivere e i miei personaggi mi fanno immediatamente eco.
jcarpio,

Se si head --versionblocca (e non hai altri problemi, tailo programmi simili funzionano ecc.), Questo è, come diceva @rici, quasi certamente non un normale headma qualcos'altro.
terdon,

Risposte:


2

Stavo per suggerire che il tuo headè collegato a symlink busybox, ma anche busybox funzionerà head -n 5 < foo.sh. (In effetti, quello con cui ho provato funziona head -n 5 foo.sh, ma forse ci sono versioni che non lo fanno.) Tuttavia, sembra probabile che headsul tuo computer non sia uno standard head. Forse è un alias o una funzione shell.

Piccola nota: è importante (anche se non sempre ovvio) distinguere tra un programma "sospeso" e un programma che sta semplicemente aspettando l'input dell'utente. Il tuo è in attesa di input da parte dell'utente. È diverso da, per esempio, sleep 3600o for ((i=1;i<100000000;++i)); do :; done.

Ecco alcune cose che puoi provare:

$ 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, la testa del file fornisce queste informazioni. ip-x-x-x-x:/usr/bin# file /usr/bin/head /usr/bin/head: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
jcarpio,

@jcarpio: Accidenti, il tuo kernel Linux ha appena festeggiato il suo nono compleanno! Ha hash headrivelato che stava usando quel percorso? A proposito, investigare stranezze come questa non dovrebbe essere fatto da un account di root. Se un attaccante fosse entrato nel tuo sistema e avesse iniettato nasties sopra le tue utility standard (o avesse approfittato di un $ PATH mal configurato), eseguirle come root sarebbe stato giocato nelle loro mani.
rici,

beh, l'hash head non dà niente. a questo punto, la soluzione alternativa a sed sembra a posto. grazie per l'aiuto!
jcarpio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.