如何打印所有打印并可在终端上看到的内容

时间:2016-03-21 19:01:25

标签: bash stdout stderr

我想打印GROMACS 5.1.2的所有输出。

我知道如何使用><进行std进出,还尝试2>&1一起打印错误和输出,也单独尝试,它仍然无法打印所有内容,当它告诉我什么是问题并且我需要那些信息时,特别是一些有用的提示。

我认为这不会被保存,因为它来自不同的代码,主程序执行子程序,然后崩溃,我只在屏幕上得到报告。我会在输出中看到出错的地方,那是什么,但在屏幕上我有更多的信息。

如果有人知道如何做到这一点,我会非常感激。

此外,我还没有完整的菜鸟,但如果您能明确解释,我们非常感激。

例如,如果您想使用RCBS蛋白质数据库中的gmx pdb2gmx尝试3mlj.pdb命令,我将在屏幕上阅读:

Fatal error:
Residue 'CU' not found in residue topology database

但在标准输出中,我只会读到:

This chain does not appear to contain a recognized chain molecule.

对我而言,CU是非常重要的信息,这只是一个例子。

我在这里分享我的操作系统:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.4 LTS
Release:    14.04
Codename:   trusty

也尝试了完全相同的结果:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.10
Release:    15.10
Codename:   wily

我想为批处理文件运行的bash脚本:

#$ -S /bin/bash
for infile in *.pdb
do
    gmx pdb2gmx -f $infile -o ${infile/pdb/gro} -water spce -ff oplsaa \
        -p ${infile/pdb/top} -i ${infile/pdb/itp} 2>&1 > ${infile/pdb/err}
done

1 个答案:

答案 0 :(得分:2)

您必须按正确的顺序(从左到右)进行I / O重定向。

你有:

gmx pdb2gmx …  -i ${infile/pdb/itp} 2>&1 > ${infile/pdb/err}

这会将标准错误发送到标准输出当前的位置(终端),然后将标准输出(但不是标准错误)发送到文件。

你需要:

gmx pdb2gmx …  -i ${infile/pdb/itp} > ${infile/pdb/err} 2>&1

这会将标准输出发送到文件,然后将标准错误发送到同一位置。请注意,在两个系统中,仍然有两个单独的文件描述符(1或标准输出,2或标准错误)正在使用中;唯一的问题是文件描述符连接到哪个文件。

如果您正在管理数据,则在处理其他I / O重定向之前设置管道,否则,从左到右处理每个命令的I / O重定向。

另请参阅How to pipe stderr and not stdout和Bash I/O Redirections