我已经编写了一个带有一些系统命令的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?如果有人可以解决我的问题,我将不胜感激。
答案 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调用。您可以使用fopen
和fprintf
从C编写脚本。
如果这不实用,请按照@jbm的建议使用bash -c
。但是除了通过C程序之外,你不能期望在system
的调用之间存在任何持久性。