我已经写了一个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我已经检查了之前关于错误替换的答案。dash似乎不适用于数组,那么我如何为系统命令启用Bash?如果有人能帮我排查故障,我将不胜感激。
发布于 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;
system("bash -c do_my_stuff from_this and_that etc");发布于 2015-09-12 21:33:10
首先,mapfile是一个bash4内置命令。system运行sh,而不是bash。
其次,也是错误消息的原因,您在这里使用的是进程替换:
<(g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//')sh不支持进程替换。system运行sh,而不是bash。
您有几个对system的调用。您的最后一个调用(如图所示)查看了在前面的shell进程中创建的变量a,它将不再存在!
我建议您编写一个#!/bin/bash脚本,并从C调用该脚本。您可以始终使用fopen和fprintf从C编写该脚本。
如果这不实用,可以按照@jbm建议的方式使用bash -c。但是,除了通过C程序之外,您不能期望跨system调用的持久性。
https://stackoverflow.com/questions/32536703
复制相似问题