2015-01-02 17 views
7

MODIFICA 2: anche fare "ls *()" fa sì che bash non restituisca e utilizzi il 100% di una cpu. Qualcuno sa perché bash sta facendo questo?Passare "*()" come argomento a un programma in bash

Stavo imparando C e imparavo argomenti e mi chiedevo quali caratteri facessero cose strane quando passavano come argomenti. Ho superato "*()" senza virgolette ad un programma C attraverso bash come:

$ ./program *() 

Bash non poteva essere uscire con ctrl c o ctrl z. Quando ho guardato htop, usavo il 100% di una CPU e ho dovuto SIGKILL. Qualcuno sa cosa sta succedendo qui. Sono solo curioso.

EDIT: anche il semplice programma di

#include <stdio.h> 
int main(int argc, char *argv[]){ return 0; } 

cause questo comportamento.

+0

quale programma era? –

+1

Si dovrebbe avere un errore di sintassi da 'bash' a causa delle parentesi non quotate. – chepner

+1

@chepner 'ls *()' non fa nulla di utile sul mio sistema, ma non ottengo un errore da bash sulle parentesi – hetepeperfan

risposta

5

Questo sembra essere un bug noto in bash, risolto nella versione 4.3.16. Si verifica solo se la funzione è abilitata extglob, ad esempio, se si dispone di un comando come

shopt -s extglob 

nel vostro .bashrc o qualche altro file init.

posso riprodurre in modo coerente con la bash 4.3.11 su Linux Mint 17:

$ bash --norc 
bash-4.3$ mkdir empty 
bash-4.3$ cd empty 
bash-4.3$ echo *() 
bash: syntax error near unexpected token `(' 
bash-4.3$ shopt -s extglob 
bash-4.3$ echo *() 

La shell si blocca dopo l'ultimo comando. Si noti che l'ho eseguito in una directory vuota; il problema si verifica anche in una directory non vuota.

I documenti manuali bash una forma di wildcard che viene attivato solo quando extglob è attivata:

`*(PATTERN-LIST)' 
    Matches zero or more occurrences of the given patterns. 

Dato *(), che è zero o più occorrenze della stringa vuota. Dato che ci sono infinitamente molte occorrenze della stringa vuota in qualsiasi stringa, posso vedere come ciò potrebbe causare un ciclo infinito se non c'è un codice di caso speciale per evitarlo.

E sembra essere stato risolto in una versione successiva. Vedo il problema in 4.3.11 ma non in 4.3.30. il commento di rici suggerisce che probabilmente la patch 016 l'ha corretto. E la bug report corrispondente alla patch include questo:

1) bash gets stuck 

shopt -s extglob 
echo !(*/) # never returns, cannot be interrupted 

che direi conferma che questo è il bug.

+1

La mia ipotesi è che sia stato corretto dalla patch 016, che è l'unica patch che vedo tra 011 e 030 che tocca le funzioni glob. – rici

+0

@rici: Sì, è quasi certo. –

0

Si potrebbe vedere cosa sta facendo con strace -p pid. Il comportamento è riproducibile dopo un riavvio? Bash mi ha dato un errore di sintassi quando l'ho provato su CentOs 6.3. Mi sembra che qualcosa sia danneggiato nel tuo sistema ma forse solo nel kernel in esecuzione, forse nella tabella proc.

tn:11: cat program.c 
#include <stdio.h> 
int main(int argc, char *argv[]){ return 0; } 
tn:12: gcc program.c 
tn:13: ./a.out *() 
bash: syntax error near unexpected token `(' 
tn:13: bash -version 
GNU bash, version 4.1.2(1)-release (i386-redhat-linux-gnu) 
tn:14: uname -a 
Linux localhost.localdomain 2.6.32-279.11.1.el6.i686 #1 SMP Tue Oct 16 14:40:53 UTC 
2012 i686 i686 i386 GNU/Linux 
tn:15: cat /etc/redhat-release 
CentOS release 6.3 (Final) 
tn:16: gcc --version 
gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4) 
+0

È un noto bug di bash; guarda la mia risposta –

Problemi correlati