gpt4 book ai didi

c - 用 C 编写可移植的命令行包装器

转载 作者:可可西里 更新时间:2023-11-01 12:35:46 26 4
gpt4 key购买 nike

我正在编写一个名为 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 );
}

Windows 使这种方法复杂化。显然 Windows 中的程序没有传递参数数组,它们将所有参数作为单个字符串传递,然后进行自己的解析!因此类似于 perl5i -e "say 'Hello'"变成 perl -Mperl5i -e say 'Hello' Windows 无法处理缺少引号的问题。

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

更新:更清楚一点,这是随附的软件,因此需要使用特定 shell 或调整 shell 配置(例如,alias perl5i='perl -Mperl5i')的解决方案并不令人满意。

最佳答案

对于 Windows,使用批处理文件。

perl5i.bat

@echo off
perl -Mperl5i %*

%* 是所有命令行参数减去 %0

在 Unixy 系统上,类似的 shell 脚本就足够了。

更新:

我认为这会奏效,但我不是 shell 向导,也没有方便测试的 *nix 系统。

perl5i

#!bash

perl -Mperl5i $@

再次更新:

呸!现在我正确理解了您的 #! 注释。我的 shell 脚本可以在 CLI 中运行,但不能在 #! 行中运行,因为 #!foo 要求 foo 是一个二进制文件。

忽略之前的更新。

Windows 似乎让一切都复杂化了。我认为您最好使用批处理文件。

你可以 use a file association , 将 .p5iperl -Mperl5i %* 关联起来。当然,这意味着在注册表中乱搞,IMO 最好避免这样做。最好在您的文档中包含有关如何手动添加关联的说明。

另一个更新

您可能想看看如何 parl做到了。

关于c - 用 C 编写可移植的命令行包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1095309/

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