通过 system() 函数调用防止野卡扩展



我读过这个:停止shell通配符扩展?和类似 - 这不是一个重复的问题。

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

script.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 扩展(通过任何标志、更改的文件等 - 如果需要,我很乐意修改盒子上的任何文件)。

为了结束循环,因为斯拉瓦没有发布答案......摘自他的评论:

您可以使用自己的system()函数创建一个共享库,并通过 varLD_PRELOAD添加它

我最终使用了这种方法 - 它工作得很好。

相关内容

  • 没有找到相关文章

最新更新