gpt4 book ai didi

通过 shell-wrapper 脚本将带有空格的命令行参数传递给 C 程序

转载 作者:太空狗 更新时间:2023-10-29 15:55:38 29 4
gpt4 key购买 nike

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

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

#!/bin/sh

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

./data_sniffer.bin $*

exit $?

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

这是 main() 的代码片段:

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

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

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

最佳答案

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

有关$*$@"$@" 之间区别的更多信息,请参见here .


the author of this question changed it completely and came forward with more information regarding the matter, I will let everything already written stand but please remember that this was written before his/her last edit..


关于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

我的建议

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

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

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

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


command-line 解析为 argv 不是您作为开发人员应该担心的事情,您不必为二进制文件实现任何强制功能本身来处理它的参数中的空格。

关于通过 shell-wrapper 脚本将带有空格的命令行参数传递给 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11483877/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com