在C中编写可移植的命令行包装器

Sch*_*ern 12 c windows perl command-line

我正在编写一个名为perl5i的perl模块.它的目标是在一个模块中修复一大堆常见的Perl问题(使用许多其他模块).

要在命令行上为一个内容调用它,你会写:perl -Mperl5i -e 'say "Hello"' 我认为这太冗长,所以我想提供一个perl5i包装器,这样你就可以写了perl5i -e 'say "Hello"'.我也希望人们能够编写脚本,#!/usr/bin/perl5i因此它必须是一个已编译的C程序.

我想我所要做的就是将"-Mperl5i"推到参数列表的前面并调用perl.这就是我尝试过的.

#include <unistd.h>
#include <stdlib.h>

/*
 * Meant to mimic the shell command
 *     exec perl -Mperl5i "$@"
 *
 * This is a C program so it works in a #! line.
 */

int main (int argc, char* argv[]) {
    int i;
    /* This value is set by a program which generates this C file */
    const char* perl_cmd = "/usr/local/perl/5.10.0/bin/perl";
    char* perl_args[argc+1];
    perl_args[0] = argv[0];
    perl_args[1] = "-Mperl5i";

    for( i = 1;  i <= argc;  i++ ) {
        perl_args[i+1] = argv[i];
   }

   return execv( perl_cmd, perl_args );
}
Run Code Online (Sandbox Code Playgroud)

Windows使这种方法复杂化.显然,Windows中的程序不传递参数数组,它们将所有参数作为单个字符串传递,然后进行自己的解析!因此,像perl5i -e "say 'Hello'"成为perl -Mperl5i -e say 'Hello'和Windows无法处理缺乏引用.

那么,我该怎么处理呢?在Windows上包装引号中的所有内容并转义?有没有图书馆来处理这个问题?有更好的方法吗?我可以不在Windows上生成C程序并将其写为perl包装器,因为它不支持#!无论如何?

更新:更明确一点,这是运送软件所以需要使用某个shell或调整shell配置(例如alias perl5i='perl -Mperl5i')的解决方案并不令人满意.

Ale*_*ack -1

如果您能够使用 C++,那么 Boost.Program_options 可能会有所帮助:

http://www.boost.org/doc/libs/1_39_0/doc/html/program_options.html