6

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

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

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

4

3 回答 3

4

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

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

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

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

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

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

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

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

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

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

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

我希望这会有所帮助=)

于 2012-10-23T17:15:12.207 回答
4

我确信有人制造了一种工具,只是因为他们可以,但我还没有见过。如果您需要从 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 编译器来自动完成。

那么有可能吗?当然!
例子?抱歉,没有。

于 2012-10-23T17:46:40.867 回答
-1

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

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

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

正如其中一个页面所提到的,它介于小工具和实际工具之间。

于 2018-09-30T19:40:00.770 回答