从用于运行shell脚本的excl获取输出

从用于运行shell脚本的excl获取输出,c,linux,shell,execl,C,Linux,Shell,Execl,您好,我想获得关于从脚本中获取输出的建议,我应该从excl调用中执行该脚本: void getCurrentFSLSMode(char* const in_fsls_directory, enum Mode* out_mode) { int link[2]; pid_t pid; char buffer[MAX_PATH_STR_LENGTH]; char command_buffer[MAX_COMMAND_STR_LENGTH]; char script_name[]

您好,我想获得关于从脚本中获取输出的建议,我应该从excl调用中执行该脚本:

void getCurrentFSLSMode(char* const in_fsls_directory, enum Mode* out_mode) {
  int link[2];
  pid_t pid;

  char buffer[MAX_PATH_STR_LENGTH];
  char command_buffer[MAX_COMMAND_STR_LENGTH];
  char script_name[] = "/scpt.sh\0";

  if (pipe(link)==-1)
    printf("pipe");

  if ((pid = fork()) == -1)
    printf("fork");


  if(pid == 0) {

    dup2 (link[1], STDOUT_FILENO);
    close(link[0]);
    close(link[1]);
    command_buffer[0] = '\0';
    strcat(command_buffer, in_fsls_directory);
    strcat(command_buffer, script_name);
    printf("%s\n", command_buffer);
    execl("/bin/sh", "sh", command_buffer, (char *)0);

  } else {

    close(link[1]);
    int nbytes = read(link[0], buffer, sizeof(buffer));
    buffer[nbytes - 1] = '\0';

    // LAZY COMPARISON
    // not algorithm name, it's just what im doing.
    // 
    printf("DBG :  %s %d\n", buffer, nbytes);
    if (buffer[0] == 'G') {
      *out_mode = K;
    } else if (buffer[0] == 'K') {
      *out_mode = G;
    } else {
      *out_mode = CLEARED;
    }

    wait(NULL);
  }
}
如果我在运行二进制文件时使用相同的代码,我就能读出它的输出, 但是,当我尝试执行上面的脚本时,我只能读取发出的命令

例如:

excl("binary command to run");
read(output)
output == "correct output"
但如果

excl("shell script to run");
read(output)
output == "shell script to run"

这是为什么?

您已经检查了
read
调用是否成功?
fork
调用是否成功?“<代码> ExcLe>代码>调用成功了吗?顺便考虑一下,您的脚本使用的是STDRR而不是STDOUTOh,如果脚本或命令产生的输出比<代码> Max PaseStuthStReals字符还要多?调用成功了,当我把应用程序输出到管道时,我看到了它。我调用的脚本只是执行了一个二进制应用程序。我检查了你的代码,但仍然无法得到你想要做的。您能否显示可以执行的成功二进制运行版本的完整代码,以及脚本代码的错误运行版本的完整代码?您是否已检查
read
调用是否成功?
fork
调用是否成功?“<代码> ExcLe>代码>调用成功了吗?顺便考虑一下,您的脚本使用的是STDRR而不是STDOUTOh,如果脚本或命令产生的输出比<代码> Max PaseStuthStReals字符还要多?调用成功了,当我把应用程序输出到管道时,我看到了它。我调用的脚本只是执行了一个二进制应用程序。我检查了你的代码,但仍然无法得到你想要做的。您能否显示可以执行的成功二进制运行版本的完整代码,以及脚本代码的错误运行版本的完整代码?而且betrer也会粘贴你的脚本