【问题标题】:Weird behavior when passing * as a command line parameter on linux [closed]在linux上将*作为命令行参数传递时的奇怪行为[关闭]
【发布时间】:2014-03-04 00:27:04
【问题描述】:

我有一个非常简单的 c 程序:

#include <stdio.h>
int main (int argc, char ** argv){
  printf ("%s\n",argv[1]);
}

当像这样在 Linux/bash 上运行它时:

./a.out *

我得到以下输出:

a.c

为什么?

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于 shell 的使用。
  • @H2CO3:有点。如果 Yigal 用于 Windows/DOS,则 shell 不会解释任何内容,并且 * 被传递给需要链接到库或处理 * 本身的程序。
  • 不要对这个问题投反对票。我已经有一段时间没有这么努力地 ROFL 了——它有一些严肃的娱乐价值。 :D
  • 我同意@ThorX89,而不是仅仅点击投反对票,请说明投反对票的理由?
  • @AmitPandya ThorX89 是在开玩笑。原因就在我的第一条评论中。

标签: c linux shell command-line-arguments glob


【解决方案1】:

因为* 是一个全局字符,会扩展为当前目录中的文件列表。

如果你想传递一个文字 * 你需要引用或转义它:

./a.out '*'

【讨论】:

  • 在这种情况下,OP 的源文件可能与已编译的可执行文件位于同一目录中。我希望更多的业余程序员知道这个功能......肯定比自己处理通配符要好。
【解决方案2】:

我不知道,但是在运行带有全局字符(例如 * 或 ?)的命令行时,命令行解释器首先扩展字符,然后才运行程序。

例如,如果您的程序是:

#include <stdio.h>
int main (int argc, char ** argv){
  int i;
  printf ("argc=%d\n",argc);
  for (i=0;i<argc;i++){
    printf("%d: %s\n",i,argv[i]);
  }
}

然后你像这样运行它:

./a.out *

,那么输出将是:

argc=4
0: ./a.out
1: a.c
2: a.c~
3: a.out

当然,输出将取决于当前目录的内容。

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多