【问题标题】:Convert Bash Script to C. Is that possible?将 Bash 脚本转换为 C。这可能吗?
【发布时间】:2012-10-13 15:42:13
【问题描述】:

我找到了following Bash -> C 转换器。

这种方式可以从bash转换成c吗?

原因:C 比 BASH 快吗?我想将某些东西作为守护进程而不是 cron 作业来运行。

【问题讨论】:

  • 您当然可以从 C 中运行 bash 脚本。而且由于 bash 是一种非常简单的语言,因此可以手动将其转换为 C。
  • 您尝试这样做是否有非学术原因?还是只是你的兴趣?
  • 假设 bash 是用 C 编写的,假设一个转换工具可以打印出大部分 bash 的源代码,并通过一个硬编码参数给它。我真的不相信你可以用 bash 语言编写可靠的 bash-to-C 转换器!
  • C 会比 BASH 快得多,对吧?

标签: c bash converters


【解决方案1】:

有可能,问题是这样做的目的是什么。它们可能是以下的子集:

  1. 速度解释的脚本可能会更慢
  2. 可维护性也许您有一段时间对 C 有更多经验
  3. 灵活性脚本显示了通过合理努力可以实现的限制
  4. 集成也许您已经有了一个愿意与脚本紧密集成的代码库
  5. 便携性

还有其他原因,例如可扩展性、效率等等。

基于“转换”的目标,有很多方法可以实现 C 等效,改变“本机”的代码量。作为一个例子,我们可以考虑两个极端。

在一个极端情况下,我们有一个编译后的 C 代码,其执行方式主要与 bash 相同,因此原始脚本的每一行都会生成与 fork/exec/wait 系统调用等效的代码,其中的更改主要是执行等效于通配符扩展、从环境变量中检索值、处理分叉进程的同步以及使用适当的系统调用处理管道。

请注意,这种“简单”的转换已经是大量的工作,这可能比编写另一个 shell 解释器更糟糕。此外,它不能满足上述许多目标,因为在可移植性方面,它仍然可能依赖于操作系统的系统调用,而在性能方面,唯一的好处是最初解析命令行。

在另一个极端,我们以更 C 的方式进行了完全重写。这会将所有条件替换为 C 条件,lscdrm 命令到它们各自的系统调用中,并可能用适当的库替换字符串处理。

这在实现某些目标方面可能会更好,但成本可能会比其他方式更大,而且还会消除大量代码重用,因为您必须实现与简单命令等效的功能。

至于自动化工具,我不知道,如果有的话,它们可能没有广泛使用,因为将 Bash 转换为 C 或将 C 转换为 Bash 可能不是一个好主意。如果出现这种需求,可能是设计问题的征兆,因此重新设计可能是更好的解决方案。编程语言和脚本语言是用于不同工作的不同工具,即使它们可以完成的工作之间存在交叉领域。一般来说,

Don't script in C, and don't code in Bash

最好知道如何以及何时使用您拥有的工具,然后找到通用的通用工具(也就是没有银弹之类的东西)。

我希望这会有所帮助 =)

【讨论】:

  • 水瓶座那个链接已经失效了。
【解决方案2】:

我确信有人制作了一种工具,只是因为他们可以,但我还没有见过。如果您需要从 C 代码运行 bash 脚本,可以通过(例如)系统调用直接执行它:

system("if [ -f /var/log/mail ]; then echo \"you've got mail! (file)\"; fi");

除此之外,我不知道“自动”执行此操作的简单方法。作为人类,我们可以查看以上内容并将其等同于:

if( access( "/var/log/mail", F_OK ) != -1 )
    printf("you've got mail! (file)");

作为可以实现的十几种方法之一。所以手动做这件事很容易,显然要花更多的精力来做,可以认为是 bash->C 编译器自动完成。

那么有可能吗?当然!
例子?对不起,没有。

【讨论】:

    【解决方案3】:

    当我需要时,我可以使用一个程序来混淆代码。 对于我使用过的一些程序,它确实提高了速度,在其他程序上它减慢了脚本的速度,但这不是我使用它的原因。对我来说主要的效用是二进制文件不能被普通用户更改或读取。

    文章:这里http://www.linux-magazine.com/Online/Features/SHC-Shell-Compiler

    开发者的网站在这里:http://www.datsi.fi.upm.es/~frosal/sources/

    正如其中一页所述,它介于小工具和实际工具之间。

    【讨论】:

    • 可以通过运行ps | grep process 轻松提取 SHC 二进制文件的源代码。 shell 代码将在进程名称旁边。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2022-09-27
    • 2015-12-21
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多