gpt4 book ai didi

c++ - 使用 system() 函数调用防止通配符扩展

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:05 25 4
gpt4 key购买 nike

我读过这个:Stop shell wildcard character expansion? 和类似的 - 这不是一个重复的问题。

我正在处理一组遗留的 C++ 代码,从中构建了许多二进制文件。这段代码使用 system 函数来执行一个 shell 脚本并传递给它一些参数。不幸的是,事实证明,一些参数可能包含 * 字符,但参数没有正确转义。结果,当执行 shell 脚本时,* 得到扩展,这不是我想要的。这是复制问题的简单代码:

脚本.sh

#!/bin/bash

i=1
for var in "$@"
do
echo "$i => $var"
((i++))
done

程序.cpp

#include <stdlib.h>
#include <string>

int main(int argc, char* argv[])
{
std::string command = "/tmp/sh/script.sh *";
return system(command.c_str());
}

当编译的二进制文件执行时,我得到文件列表作为 shell 的参数,而不是星号:

$ ./program
1 => program
2 => program.cpp
3 => script.sh

现在,如果我使用 set -fset -o noglob 在 shell 中关闭 glob 扩展,那么直接调用脚本将按预期工作:

$ set -f
$ ./script.sh *
1 => *

然而,当使用 system 执行脚本时,这不起作用:

$ set -f
$ ./program
1 => program
2 => program.cpp
3 => script.sh

system执行命令时,有什么方法可以防止扩展吗?

我真的想避免必须重建二进制文件,因为在操作和管理上这将是一项巨大的工作量。

更新:正如我提到的,我想避免对 cpp 源代码进行任何更改;我只想在操作系统级别禁用 glob 扩展(通过任何标志、更改的文件等 - 如果需要,我很乐意修改框中的任何文件)。

最佳答案

为了结束循环,因为 Slava 没有发布答案...从他的评论中复制:

You can create a shared lib with your own system() function and add it by LD_PRELOAD var

我最终使用了这种方法 - 而且效果非常好。

关于c++ - 使用 system() 函数调用防止通配符扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524597/

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