Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通行证*()";作为bash中程序的参数_C_Linux_Bash - Fatal编程技术网

C 通行证*()";作为bash中程序的参数

C 通行证*()";作为bash中程序的参数,c,linux,bash,C,Linux,Bash,编辑2:即使执行“ls*()”也会导致bash不返回并使用100%的cpu。有人知道bash为什么这么做吗 我在学习C语言,学习参数,想知道当作为参数传递时,角色会做些什么奇怪的事情。我通过bash将不带引号的“*()”传递给c程序,如: $ ./program *() 无法使用ctrl c或ctrl z退出Bash。当我查看htop时,它使用了100%的CPU,我不得不杀死它。有人知道这里发生了什么吗。我只是好奇 编辑:即使是简单的程序 #include <stdio.h> in

编辑2:即使执行“ls*()”也会导致bash不返回并使用100%的cpu。有人知道bash为什么这么做吗

我在学习C语言,学习参数,想知道当作为参数传递时,角色会做些什么奇怪的事情。我通过bash将不带引号的“*()”传递给c程序,如:

$ ./program *()
无法使用ctrl c或ctrl z退出Bash。当我查看htop时,它使用了100%的CPU,我不得不杀死它。有人知道这里发生了什么吗。我只是好奇

编辑:即使是简单的程序

#include <stdio.h>
int main(int argc, char *argv[]){ return 0; }
#包括
intmain(intargc,char*argv[]){返回0;}

导致此行为。

您可能会看到它使用strace-ppid做了什么。重新启动后该行为是否可以重现?当我在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)
tn:11:cat程序.c
#包括
intmain(intargc,char*argv[]){返回0;}
tn:12:gcc程序.c
tn:13:/a.out*()
bash:意外标记“(”附近出现语法错误
tn:13:bash-version
GNUBash,版本4.1.2(1)-发行版(i386 redhat linux GNU)
tn:14:uname-a
Linux localhost.localdomain 2.6.32-279.11.1.el6.i686#1 SMP周二10月16日14:40:53 UTC
2012 i686 i686 i386 GNU/Linux
tn:15:cat/etc/redhat释放
CentOS 6.3版(最终版)
tn:16:gcc——版本
gcc(gcc)4.4.6 20120305(红帽4.4.6-4)

这似乎是bash中的一个已知错误,已在4.3.16版中修复。仅当启用了
extglob
功能时,才会发生此错误,例如,如果您有如下命令

shopt -s extglob
.bashrc
或其他一些init文件中

我可以在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可能已经修复了它。与补丁对应的包括:

1) bash gets stuck

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

我要说的是,这证实了这就是bug。

它是什么程序?你应该从
bash
中得到一个语法错误,因为括号中没有引号。@chepner
ls*()
在我的系统上没有任何用处,但我没有从bash那里得到关于括号的错误。我无法重现您描述的行为。您的操作系统和
bash
版本是什么?不带引号的括号应该会阻止
bash
甚至运行
程序,因此不清楚您的程序的行为我猜它是由补丁016修复的,这是我在011和030之间看到的唯一一个涉及全局函数的补丁。@rici:是的,几乎可以肯定。这是一个已知的bash bug;请看我的答案。