使用system()函数调用防止wildecard扩展

时间:2017-06-13 14:37:51

标签: c++ linux bash shell wildcard-expansion

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

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

script.sh

#!/bin/bash

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

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

1 个答案:

答案 0 :(得分:0)

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

  

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

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