C

时间:2015-09-12 08:17:51

标签: c bash shell

我已经编写了一个带有一些系统命令的C程序。我使用的是名为Gromacs的软件。这是C代码的片段: -

       #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;
     }

我收到错误

      sh: 1: Bad substitution

我已经检查过以前的错误替换答案。似乎破折号不适用于数组,那么我如何为系统命令启用Bash?如果有人可以解决我的问题,我将不胜感激。

2 个答案:

答案 0 :(得分:4)

sh vs dash vs bash不是此处的根本问题。

您在第二次调用system()时创建了'a'(无论是什么)。

然后,您尝试在第system()次呼叫中使用此“a”。

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

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

您需要做的是以某种方式将'a'保存到后续调用可能起作用的某个文件中。

换句话说,每次拨打system()都会像打开一个新终端,做你的东西然后关闭它一样。在一个终端(shell会话)中创建的变量在下一个中不存在。

修改

并且说服你sh/dash/bash不是你的根本问题,一旦你检查了你的命令在同一个shell会话(终端)中输入时运行正常,你总是可以明确地使用{{1}在您的bash来电中;

system()

答案 1 :(得分:0)

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

其次,以及错误消息的原因,您在此处使用进程替换

<(g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//')

sh不支持流程替换。 system运行sh,而非bash

您有多次致电system。您的上一次调用(如图所示)查看在先前的shell进程中创建的变量a,它不再存在!

我建议您编写一个bash脚本,其中包含#!/bin/bash,并从C调用。您可以使用fopenfprintf从C编写脚本。

如果这不实用,请按照@jbm的建议使用bash -c。但是除了通过C程序之外,你不能期望在system的调用之间存在任何持久性。