您可以直接在命令行中调用函数吗?

时间:2020-09-16 05:16:42

标签: c linux command-line

例如,如果我具有以下功能

void printText(char text [100]){
    printf("%d", text);
}

然后我可以在命令行中这样做

printText(Hello World)

然后得到我的预期输出

Hello World

2 个答案:

答案 0 :(得分:2)

这取决于您的外壳。一些外壳确实支持功能。在bash,POSIX Shell以及可能的其他版本中,以下是正确的语法:

printText() {
   printf '%s\n' "$1"
}

printText 'Hello World'

如果您的意思是字面上的意思,那么不,即使不提及函数所在的文件,也无法调用该函数。编写该函数所用的语言是无关的。

但是可以编译C函数并以某种方式从shell调用它吗?是。如果从该函数创建了一个共享库(在unixy系统上是共享对象,在Windows上是DLL),则可以。这样做需要工具,但是这样的工具可能会退出。 (Windows还支持COM objects和许多派生技术。其中一些甚至可以使任务更容易。)

(我无法确定此类工具是否确实存在,或者它们是什么,因为在StackOverflow上软件建议不合时宜。我会说这样的工具可以围绕libffi之类的库构建。 )

答案 1 :(得分:1)

一种解决方案是依靠dlopen() / LoadLibrary()dlsym() / GetProcAddress(),但您不能确保该功能 原型符合您的期望。

更强大的解决方案在于提供一个填充的查找表 具有您所知道的符合预期用途的功能。

/**
  gcc -std=c99 -o prog_c prog_c.c \
      -pedantic -Wall -Wextra -Wconversion \
      -Wc++-compat -Wwrite-strings -Wold-style-definition -Wvla \
      -g -O0 -UNDEBUG -fsanitize=address,undefined

  $ ./prog_c printText "Hello world"
  printText --> <Hello world>
  $ ./prog_c textLen "Hello world"
  textLen --> 11
  $ ./prog_c what "Hello world"
  cannot find function 'what'
**/

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

void
printText(const char *text)
{
  printf("printText --> <%s>\n", text);
}

void
textLen(const char *text)
{
  printf("textLen --> %d\n", (int)strlen(text));
}

typedef struct
{
  const char *name;
  void (*fnct)(const char *);
} TextFunction;

bool // success
call_text_function(const char *name,
                   const char *arg)
{
  static TextFunction table[]={ {"printText", printText},
                                {"textLen",   textLen},
                                {NULL,        NULL} };
  for(int i=0; table[i].name!=NULL; ++i)
  {
    if(strcmp(table[i].name, name)==0)
    {
      table[i].fnct(arg);
      return true;
    }
  }
  return false;
}

int
main(int argc,
     char **argv)
{
  if(argc!=3)
  {
    fprintf(stderr, "usage: %s function arg\n", argv[0]);
    return 1;
  }
  if(!call_text_function(argv[1], argv[2]))
  {
    fprintf(stderr, "cannot find function '%s'\n", argv[1]);
    return 1;
  }
  return 0;
}