通过shell-wrapper脚本向C程序添加空格的命令行参数

dub*_*uga 3 c command-line-arguments

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

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

#!/bin/sh

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

./data_sniffer.bin $*

exit $?
Run Code Online (Sandbox Code Playgroud)

这个问题肯定与此有关$*.有没有正确转发命令行参数的解决方案?

以下是来自的代码段main():

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

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

./data_sniffer /mnt/pod/movies/some\ test\ movie\ file.avi
Run Code Online (Sandbox Code Playgroud)

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

谁知道这里有什么问题?我认为我不是第一个遇到这个问题的人(尽管我在这里找不到相关的问题).

Fil*_*efp 6

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

更多关于的区别$*,$@并且"$@"可以发现在这里.


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


关于argv......

它不需要从你太多的开发者,我很想(和它的更真实)的说法,它需要什么你.

传递给应用程序的参数由执行二进制文件的shell处理,下面这样做肯定会按照你想要的方式工作(即使我发现你声称当前shell没有正确处理它很奇怪'\ '):

./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
Run Code Online (Sandbox Code Playgroud)

我的推荐

  • 你有没有尝试printf ("argv[1]: %s\n", argv[1]);在main的开头做验证它的内容?

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

可悲的是,唯一合理的写法就是你做错了什么.但是,如果没有关于该问题的进一步信息,我们无法回答.

我觉得很难相信你的shell中有一个bug ,即使这当然是可能的 - 我对此表示怀疑.


解析命令行argv是不是你作为一个开发者应该担心的,还有,你必须实现对二进制文件本身来处理空间在它的参数(们)没有,执行功能.