【问题标题】:How can I call a function defined in a bash shell script from a C program如何从 C 程序调用 bash shell 脚本中定义的函数
【发布时间】:2013-01-25 05:37:07
【问题描述】:

我有

    #!/bin/sh

    func1()
    {
        echo "This is func1 from shell script"
    }

    func2()
    {
        echo "This is func2 from shell script"

    }

我想从 C 程序中调用 func1 和 func2。我可以这样做吗?

【问题讨论】:

  • 除非您正在编写可加载的内置函数,否则不会。
  • @ormaaj 你有多确定?
  • @ormaaj 你能详细说明可加载的内置函数吗?
  • @abc Using and Writing Bash Dynamically Loadable Built-In Commands。您可以编写访问 bash 内部 API 的 C 代码,将 C 代码编译成 .sos,然后使用内置的 enable 将它们加载到 bash 中。

标签: c++ c linux bash shell


【解决方案1】:

这不太可能是个好主意,但我想你可以这样写:

if (! fork()) { // TODO fork can return -1 on error; should check for that
    execl("/bin/sh", "-c", ". FILE && func1", (char *)NULL);
    // TODO should check to make sure execlp successfully replaced the process
}

其中FILE 是定义func1.sh 文件的名称。以上将产生一个子进程,并用参数-c(意思是“要运行的脚本是下一个参数”)和. FILE && func1(其中是脚本;意思是“运行FILE中的命令,如果成功,则运行命令func1”)。

更多信息:

【讨论】:

  • 这也有效:system("source /home/abc/cpractice/test_functions ; func1 ; func2 ");的文档在哪里;这里使用的语法?
  • @abc: ; 只是一种分离命令的方式。如果您愿意,可以改用\n。 (两者并非在所有情况下都完全等价,但在大多数情况下是等价的。)
  • 请注意,如果脚本包含除函数声明之外的任何内容(即,如果它与普通脚本类似),那么它也会被执行。正如@ruakh 所说,这不太可能是一个好主意。
  • @GordonDavisson 知道了。谢谢。
  • 最好使用&& 而不是;
【解决方案2】:

比使用 fork / exec 简单一点的是 stdlib "system" 命令。

man 3 system

假设你的 bash 函数在文件 "/tmp/scripts.sh" ...

system("bash -c \". /tmp/scripts.sh ; func1 ; func2\"");

【讨论】:

    【解决方案3】:

    如果你想接收执行脚本的退出代码,你应该使用system,否则使用vfork + exec*

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 2018-03-23
      • 2018-06-06
      • 2018-12-02
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2018-12-27
      • 2011-09-27
      相关资源
      最近更新 更多