传递" *()"作为bash中程序的参数

时间:2015-01-02 22:30:04

标签: c linux bash

编辑2:即使执行“ls *()”也会导致bash无法返回并使用100%的一个cpu。有谁知道为什么bash会这样做?

我正在学习C并学习参数,并且想知道当作为参数传递时,哪些角色做了奇怪的事情。我通过bash将“*()”无引号传递给c程序,如:

$ ./program *()

无法使用ctrl c或ctrl z退出Bash。当我看到htop时,它使用100%的一个CPU而且我必须使用SIGKILL。有谁知道这里发生了什么。我只是好奇。

编辑:即使是简单的程序

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

导致此行为。

2 个答案:

答案 0 :(得分:5)

这似乎是bash中已知的错误,已在4.3.16版中修复。仅当启用了extglob功能时才会出现,例如,如果您有像

这样的命令
shopt -s extglob

在您的.bashrc或其他一些初始文件中。

我可以在Linux Mint 17上使用bash 4.3.11一致地重现它:

$ 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 *()

shell在最后一个命令后挂起。请注意,我在一个空目录中运行它;问题也发生在非空目录中。

bash手册记录了一种仅在启用extglob时启用的通配符:

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

给定*(),这是空字符串的零次或多次出现。由于在任何字符串中出现无限多的空字符串,我可以看到,如果没有特殊情况代码可以避免它,那么这可能会导致无限循环。

它似乎已在更高版本中修复。我在4.3.11中看到了问题,但在4.3.30中没有看到。 rici的评论表明补丁016可能已经修复了它。与补丁相对应的bug report包括:

1) bash gets stuck

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

我要说的确认那是错误。

答案 1 :(得分:0)

你可能会看到strace -p pid 正在做什么。重启后行为是否可重现?当我在CentOs 6.3上尝试时,Bash给了我一个语法错误。在我看来,系统中的某些内容已损坏,但可能只在运行的内核中,可能在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)