我找到了以下Bash -> C 转换器。
这种方式可以从bash转换为c吗?
原因:C 比 BASH 快吗?我想将某些东西作为守护进程而不是 cron 作业来运行。
有可能,问题是这样做的目的是什么。它们可能是以下的子集:
还有其他原因,比如可扩展性、效率等等。
基于“转换”的目标,有很多方法可以实现 C 等效,改变“本机”的代码量。作为一个例子,我们可以考虑两个极端。
在一个极端情况下,我们有一个编译后的 C 代码,其执行方式主要与 bash 一样,因此原始脚本的每一行都会生成与 fork/exec/wait 系统调用等效的代码,其中更改主要执行与通配符扩展等效的代码,从环境变量中检索值,处理分叉进程的同步,以及使用适当的系统调用处理管道。
请注意,这种“简单”的转换已经是大量的工作,这可能比编写另一个 shell 解释器更糟糕。此外,它不能满足上述许多目标,因为在可移植性方面,它仍然可能依赖于操作系统的系统调用,而在性能方面,唯一的好处是最初解析命令行。
在另一个极端,我们以更 C 的方式进行了完全重写。这将用 C 条件句替换所有条件句ls
,cd
并将rm
命令替换为它们各自的系统调用,并可能用适当的库替换字符串处理。
这可能会更好地实现某些目标,但成本可能会比其他方式更大,同时也消除了大量代码重用,因为您必须实现与简单命令等效的功能。
至于自动化的工具,我不知道,如果有的话,它们可能没有广泛使用,因为将 Bash 转换为 C 或将 C 转换为 Bash 可能不是一个好主意。如果出现这种需求,可能是设计问题的征兆,因此重新设计可能是更好的解决方案。编程语言和脚本语言是用于不同工作的不同工具,即使它们可以完成的工作之间存在交叉领域。一般来说,
Don't script in C, and don't code in Bash
最好知道如何以及何时使用您拥有的工具,然后找到通用的通用工具(也就是没有银弹之类的东西)。
我希望这会有所帮助=)
我确信有人制造了一种工具,只是因为他们可以,但我还没有见过。如果您需要从 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 编译器来自动完成。
那么有可能吗?当然!
例子?抱歉,没有。
当我需要时,我会使用一个程序来混淆代码。对于我使用过的一些程序,它确实提高了速度,在其他程序上它减慢了脚本的速度,但这不是我使用它的原因。对我来说主要的效用是二进制文件不能被临时用户更改或读取。
文章:这里 http://www.linux-magazine.com/Online/Features/SHC-Shell-Compiler
开发者网站:http ://www.datsi.fi.upm.es/~frosal/sources/
正如其中一个页面所提到的,它介于小工具和实际工具之间。