如何将执行命令从 bash 脚本转换为 C?或如何在“W”模式下正确使用 popen()?

Posted

技术标签:

【中文标题】如何将执行命令从 bash 脚本转换为 C?或如何在“W”模式下正确使用 popen()?【英文标题】:How to translate execution commands from bash script to C? or How to properly use popen() in "W" mode? 【发布时间】:2011-02-09 18:36:04 【问题描述】:

大家好。我正在尝试将执行程序(称为 pdb2gmx)的简单 bash 脚本转换为 C 命令,以便可以将其作为函数包含在更大的程序中,但在实现它时遇到了一些麻烦。

bash 脚本:

#!/bin/sh
/usr/local/gromacs/bin/pdb2gmx -f $1.pdb -o $1.gro -p $1.top << EOF
14
6

所以发生的情况是,当运行程序时,它会停止并在两个不同的点要求用户输入,一个接一个。在 bash 脚本中,只需放下 14 和 6 似乎就可以满足输入要求,但我似乎无法在 C 中实现相同的技巧(另外,我不确定 EOF 在那里做什么,我我只是按照别人的例子,没有它,脚本将无法工作)。

这是我目前在 C 中所拥有的:

#include <stdio.h>
#include <stdlib.h>

int main() 
    FILE * pdb2gmx;
    pdb2gmx = popen( "pdb2gmx -f 1BEO.pdb -o 1BEO.gro -p 1BEO.top" , "w" );
    fprintf( pdb2gmx, "EOF" );
    fprintf( pdb2gmx, "14" );
    fprintf( pdb2gmx, "6" );
    pclose( pdb2gmx );

但是当执行此代码时,pdb2gmx 只是挂在需要用户输入的第一个点。那么我错过了什么?

我的感觉是 C 程序本身也在执行 popen 行,并且永远不会到达 fprintf 行,但我认为将 popen 模式设置为 "w" 你可以只是将返回的流视为用户输入,所以我很困惑。

【问题讨论】:

调用 fprintf 后是否尝试过刷新? shell 脚本应该将EOF 作为最后一行作为第一个EOF 的结束分隔符。没有它它会工作,但它可能会发出警告。如果这些数据行后面的脚本中有更多命令,您肯定会需要它。 【参考方案1】:

您可能需要在这些 fprintf 字符串的末尾添加一些换行符 (\n)...

【讨论】:

哇。从来没有想过,但是这么简单。现在可以了。谢谢! 而且你不需要 EOF。 " 【参考方案2】:

您是否检查了pdb2gmx 的值 - 您是否正确设置了路径以便您的程序可以找到 pdb2gmx 可执行文件?

您可能还想在 fprintf() 之后调用 fflush()

【讨论】:

以上是关于如何将执行命令从 bash 脚本转换为 C?或如何在“W”模式下正确使用 popen()?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 bash 脚本将 .xlsx 文件转换为 html?

将命令行参数转换为 Bash 中的数组

如何使用 bash 命令或 Ruby 使用 ffmpeg 将 mp4 文件批量转换为 ogg

如何从 bash 脚本中 ssh?

如何从 Bash 脚本中检查程序是不是存在?

如何让shell脚本变成可执行文件