【问题标题】:Command line arguments with spaces to a C program through shell-wrapper script通过 shell-wrapper 脚本到 C 程序的带有空格的命令行参数
【发布时间】:2012-07-14 02:16:21
【问题描述】:

如何让我的程序接受带有空格的命令行参数?

又一个编辑:我刚刚认识到该程序是从一个为程序执行设置环境的 shell 脚本启动的。由于有一些外部库,LD_LIBRARY_PATH 设置为当前工作目录:

#!/bin/sh

ARCH=`uname -m`
export LD_LIBRARY_PATH=".:lib/magic/linux-${ARCH}"

./data_sniffer.bin $*

exit $?

这个问题肯定与$* 有关。有没有办法正确转发命令行参数?

这是来自main()的code-sn-p:

if (stat(argv[1], &lStat) != 0)
{   
    fprintf(stderr, "Cannot stat(2) given file: %s. \n", argv[1]);
    return EXIT_FAILURE;
}   

我正在使用以下参数启动我的程序:

./data_sniffer /mnt/pod/movies/some\ test\ movie\ file.avi

生成的错误消息如下所示: 无法 stat(2) 给定文件:/mnt/pod/movies/some.

有人知道这里出了什么问题吗?我认为我不是第一个遇到这个问题的人(虽然,我在这里找不到相关的问题)。

【问题讨论】:

  • 嗨,马特,很抱歉,这是一个错误。请认为它是 argv[1] (已在问题中编辑)。
  • 我的答案已经更新了相关信息以解决您的问题,以后不要发布问题然后决定更改它 - 这对决定的我们来说非常烦人回答第一个,然后意识到这完全没有意义。
  • 我很抱歉这样做。也许我应该开始一个新问题,而不是下次更改现有问题。感谢您提供有用的答案。它解决了我的问题。

标签: c command-line-arguments


【解决方案1】:

在包装脚本中将./data_sniffer.bin $* 的使用替换为./data_sniffer.bin "$@",并且应该以正确的方式转发参数。

更多关于$*$@"$@"的区别可以在here找到。


这个问题的作者完全改变了它,并提出了有关此事的更多信息,我会让所有已经写好的东西保持不变,但请记住这是在他/她最后一次编辑之前写的..


关于argv..

作为开发人员,它对你的要求并不高,我很想(而且更真实)说它需要你什么

传递给应用程序的参数由执行二进制文件的 shell 处理,在下面执行此操作肯定会按照您希望的方式工作(尽管我觉得您声称当前 shell 无法处理 @987654328 很奇怪@正确):

./data_sniffer '/mnt/pod/movies/some test movie file.avi'
./data_sniffer /mnt/pod/movies/some\ test\ movie\ file.avi

# there should be no difference between the two

我的建议

  • 您是否尝试过在 main 开头使用 printf ("argv[1]: %s\n", argv[1]); 来验证它的内容?

  • 您确定使用正确的命令行参数调用正确的二进制文件吗?

可悲的是,唯一合理的事情就是你做错了什么。但是,如果没有有关该问题的更多信息,我们将无法回答。

我很难相信您的 shell 中存在错误,尽管这当然是可能的 - 我对此表示怀疑。


命令行 解析为 argv 并不是您作为开发人员应该担心的事情,您不必为二进制文件本身实现强制功能来处理这是论点。

【讨论】:

  • 它对我不起作用,无论是引号还是反斜杠转义。实际上,这也是我的想法:将命令行参数放入argv,如下所示:未转义(删除反斜杠;保留空格)。
【解决方案2】:

在我的 CentOS 5.3 中,我做了一个测试。

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

然后用不同的参数运行它:

[root@dw examples]# ./a.out a b c
argc=4
argv[0]=./a.out
argv[1]=a
argv[2]=b
argv[3]=c
[root@dw examples]# ./a.out 'a b c'
argc=2
argv[0]=./a.out
argv[1]=a b c
[root@dw examples]# ./a.out a\ b\ c
argc=2
argv[0]=./a.out
argv[1]=a b c
[root@dw examples]# ./a.out "a b c"
argc=2
argv[0]=./a.out
argv[1]=a b c

看起来像 (1) 'a b c' ; (2) a\b\c; (3) "a b c" 都在工作。

【讨论】:

  • 非常感谢您执行测试设置!请参阅我的新编辑。该问题与调用我的程序的包装脚本(不认为它是错误的来源)有关。
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多