使用 system() 函数调用防止通配符扩展
Prevent wildecard expansion with system() function call
我读过这个: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 -f
或 set -o noglob
关闭 shell 中的 glob 扩展,则直接调用脚本会按预期工作:
$ set -f
$ ./script.sh *
1 => *
然而,当使用 system
执行脚本时,这不起作用:
$ set -f
$ ./program
1 => program
2 => program.cpp
3 => script.sh
有什么方法可以防止通过system
执行命令时扩展?
我真的很想避免重建二进制文件,因为在操作和管理上这将是一项巨大的工作量。
更新: 正如我提到的,我想避免对 cpp 源代码进行任何更改;我只想在 OS 级别禁用 glob 扩展(通过任何标志、更改的文件等 - 如果需要,我很乐意修改框中的任何文件)。
为了结束循环,因为 Slava 没有 post 答案...从他的评论中复制:
You can create a shared lib with your own system()
function and add it by LD_PRELOAD
var
我最终使用了这个方法 - 而且效果非常好。
我读过这个: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 -f
或 set -o noglob
关闭 shell 中的 glob 扩展,则直接调用脚本会按预期工作:
$ set -f
$ ./script.sh *
1 => *
然而,当使用 system
执行脚本时,这不起作用:
$ set -f
$ ./program
1 => program
2 => program.cpp
3 => script.sh
有什么方法可以防止通过system
执行命令时扩展?
我真的很想避免重建二进制文件,因为在操作和管理上这将是一项巨大的工作量。
更新: 正如我提到的,我想避免对 cpp 源代码进行任何更改;我只想在 OS 级别禁用 glob 扩展(通过任何标志、更改的文件等 - 如果需要,我很乐意修改框中的任何文件)。
为了结束循环,因为 Slava 没有 post 答案...从他的评论中复制:
You can create a shared lib with your own
system()
function and add it byLD_PRELOAD
var
我最终使用了这个方法 - 而且效果非常好。