Bash here document - 将打印代码压缩到屏幕上?

时间:2014-06-17 18:34:34

标签: linux bash shell unix

我正在通过cmd“sudo / etc / bgenomics”编写一个脚本成为用户(让我们称之为基因组学)(这是由我们的管理员设置的)并运行一些bash代码作为该用户,即运行cmd,捕获退出代码并采取适当的措施。

问题是这里的文档中的bash代码被打印到屏幕上,这会分散注意力,看起来真的很不优雅。

以下是插图:

#!/bin/bash

name='George'

sudo /etc/bgenomics <<Q
/bin/bash
if (( 2 == 2 )); then
    echo "my name is $name"
    grep zzz /etc    # will return nothing and $? = 1
    echo \$?    # this should be 1 after the above cmd
fi
Q

if语句就是为了表明打印时有多烦人。

现在,所有以下内容都会打印到屏幕上:

Script started, file is /var/tmp/genomicstraces/c060644.20140617143003.11536
Script done, file is /var/tmp/genomicstraces/c060644.20140617143003.11536
brainiac-login-02$brainiac-login-02$/bin/bash
bash-3.2$ if (( 2 == 2 )); then
> echo "my name is George"
> grep zzz /etc    # will return nothing and 0 = 1
> echo $?    # this should be 1 after the above cmd
> fi
my name is George
1

我想看到的唯一部分是“我的名字是乔治”和“1”。可以吗?

3 个答案:

答案 0 :(得分:1)

是另一个进程调用此脚本吗?除非使用&#39; -x&#39;调用bash,否则输出通常不会出现。如果无法在调用过程中禁用echo,请尝试修改脚本的第一行:

#!/bin/bash +x

您可能还想在sudo命令之后删除对/ bin / bash的调用,除非您真的希望在shell中启动另一个shell。

答案 1 :(得分:1)

此处的文档通过其标准输入向bgenomics脚本提供输入。该输入的内容取决于该脚本。

如果您希望脚本打印一些输入,而不打印某些输入,则必须修改脚本。

如果bgenomics实际上是交互式shell会话的包装器(看起来像是Script startedScript done跟踪),那么这里的文档并不是最好的方法输入信息。

一种好方法是使用expect实用程序,它通过伪终端设备控制交互式程序,并提供具有大量控制的脚本语言。 expect可以抑制来自交互式程序的所有不需要的输入。它可以从程序中查找特定输出,并提供响应。例如,它可以查找来自交互式会话的login:字符串,并发送用户名。

答案 2 :(得分:1)

程序bgenomics在其中调用script来记录脚本的作用。与负责人交谈以了解他们的意图。在你理解bgenomics的目的之前,你有可能搞砸了那个作者试图做的事情。

$ script /tmp/junk.txt
Script started, file is /tmp/junk.txt
$ date            # this is a child shell of the script command
Tue Jun 17 21:04:14 EDT 2014
$ exit
Script done, file is /tmp/junk.txt