首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中系统命令的替换错误

C++中系统命令的替换错误
EN

Stack Overflow用户
提问于 2015-09-12 16:17:51
回答 2查看 540关注 0票数 0

我已经写了一个C程序,里面有一些系统命令。我使用一个叫Gromacs的软件。下面是一段C代码:

代码语言:javascript
复制
       #include<stdio.h>
       #include <stdlib.h>

      /*I have removed unnecessary code, which works fine for me. */   

      int main() {

            float LAMBDA=0.37;

            for(LAMBDA=0.37 ; LAMBDA <0.55; LAMBDA +=0.02 ) {

            system("g_bar -f md*.xvg -o -oi -oh");
            system("mapfile -t a < <(g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//')");

            printf("Free Energy:\t ");
            system("echo ${a[120]}");

       return 0;
     }

我收到一个错误

代码语言:javascript
复制
      sh: 1: Bad substitution

我已经检查了之前关于错误替换的答案。dash似乎不适用于数组,那么我如何为系统命令启用Bash?如果有人能帮我排查故障,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2015-09-12 16:40:21

sh vs dash vs bash不是问题的根源。

您在第二次调用system()时创建了一个'a‘(不管是什么)。

然后在第四个system()调用中尝试使用这个'a‘。

但这是另一个shell,这里不存在'a‘。

每次调用system()时,都会创建一个新的shell环境,并在返回时消失。

您需要做的是以某种方式将您的'a‘保存到某个文件中,以便后续调用可以处理。

换句话说,每次对system()的调用都像打开了一个新的终端一样,做完自己的事情,然后关闭它。在一个终端(shell会话)中创建的变量在下一个终端中不存在。

编辑:

为了让你相信sh/dash/bash不是你的根本问题,一旦你检查了你的命令在同一个shell会话(终端)中输入时运行正常,你总是可以显式地在你的system()调用中使用bash

代码语言:javascript
复制
system("bash -c do_my_stuff from_this and_that etc");
票数 5
EN

Stack Overflow用户

发布于 2015-09-12 21:33:10

首先,mapfile是一个bash4内置命令。system运行sh,而不是bash

其次,也是错误消息的原因,您在这里使用的是进程替换:

代码语言:javascript
复制
<(g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//')

sh不支持进程替换。system运行sh,而不是bash

您有几个对system的调用。您的最后一个调用(如图所示)查看了在前面的shell进程中创建的变量a,它将不再存在!

我建议您编写一个#!/bin/bash脚本,并从C调用该脚本。您可以始终使用fopenfprintf从C编写该脚本。

如果这不实用,可以按照@jbm建议的方式使用bash -c。但是,除了通过C程序之外,您不能期望跨system调用的持久性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32536703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档