2015-01-02 17 views
7

EDYCJA 2: nawet wykonanie "ls *()" powoduje, że bash nie zwraca i używa 100% jednego procesora. Czy ktoś wie, dlaczego bash to robi?Przekazywanie "*()" jako argumentu do programu w bash

Uczyłem się C i poznałem argumenty i zastanawiałem się, jakie postacie robią dziwne rzeczy, gdy są przekazywane jako argumenty. Zdałem "*()" bez cudzysłowów do programu C przez bash jak:

$ ./program *() 

atakujących nie można zrezygnować z ctrl C i Ctrl z. Kiedy patrzyłem na htop, używałem 100% jednego procesora i musiałem SIGKILL go. Czy ktoś wie, co się tutaj dzieje? Jestem po prostu ciekaw.

EDIT: nawet prosty program

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

przyczyn tego zachowania.

+0

jaki to był program? –

+1

Powinieneś dostać błąd składniowy z 'bash' z powodu niecytowanych nawiasów. – chepner

+1

@chepner 'ls *()' nie robi nic użytecznego w moim systemie, ale nie dostaję błędu od basha o nawiasach – hetepeperfan

Odpowiedz

5

Wygląda na to, że jest to znany błąd w bashu, poprawiony w wersji 4.3.16. Występuje tylko wtedy, gdy włączona jest funkcja extglob, na przykład, jeśli masz polecenie podobne

shopt -s extglob 

w drugim pliku inicjującego .bashrc lub jakiegoś.

mogę odtworzyć go konsekwentnie z bash 4.3.11 na 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 *() 

Skorupa wisi po ostatnim poleceniu. Zauważ, że uruchomiłem go w pustym katalogu; problem występuje również w niepustym katalogu.

bash ręczne dokumenty postaci zamiennika, który jest aktywny tylko wtedy, gdy jest włączona extglob:

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

Biorąc *(), to zero lub więcej wystąpień pusty ciąg. Ponieważ istnieje nieskończenie wiele wystąpień pustego łańcucha w dowolnym ciągu, widzę, jak to może spowodować nieskończoną pętlę, jeśli nie ma specjalnego kodu, aby tego uniknąć.

Wygląda na to, że został naprawiony w nowszej wersji. Widzę problem w 4.3.11, ale nie w 4.3.30. Komentarz rici sugeruje, że łatka 016 prawdopodobnie ją naprawiła. A bug report odpowiadający plaster zawiera to:

1) bash gets stuck 

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

który potwierdza, powiedziałbym, że to jest błąd.

+1

Domyślam się, że został naprawiony przez łatkę 016, która jest jedyną łatką, którą widzę pomiędzy 011 i 030, która dotyka funkcji globu. – rici

+0

@rici: Tak, to prawie na pewno. –

0

Możesz zobaczyć, co robi ze strace -p pid. Czy zachowanie jest odtwarzalne po ponownym uruchomieniu? Bash dał mi błąd składniowy, gdy próbowałem go na CentOs 6.3. Wydaje mi się, że coś jest uszkodzone w twoim systemie, ale może tylko w działającym jądrze, być może w tabeli 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

Jest to znany błąd bash; zobacz moją odpowiedź. –

Powiązane problemy