如何将重定向char(“<”和“>”)传递给命令?

时间:2017-09-14 06:09:04

标签: bash

我正在试图弄清楚如何制作一个我正在运行的脚本以使其更具可读性。我有多个命令,我想从实际输出中分离出来。

我的第一个想法是使用set -x,但在实际命令的输出之间仍然丢失了。所以我找到并应用了两个bash函数,我在每个函数之前调用它们:

#!/usr/bin/env bash

function c_echo(){
    local color=$1;
    shift
    local exp=$@;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

function script_cmd() {
    c_echo YELLOW "\$ $@";
    "$@";
}

export -f script_cmd
export -f c_echo

稍后在我的剧本中:

c_echo GREEN "1. Download insulin (2HIU) and Leucine zipper (2ZTA)."

script_cmd wget https://files.rcsb.org/view/2HIU.cif

这很好用,但实际上重定向的命令失败了。我有办法解决这个问题吗?

script_cmd charmm < setup_2zta.inp > setup_2zta.out

1 个答案:

答案 0 :(得分:1)

您可以将彩色输出重定向到 stderr

function script_cmd() {
    c_echo YELLOW "\$ $@" >&2
    #                     ^^^
    "$@";
}

如果你想整个charmm < setup_2zta.inp > setup_2zta.out命令着色,你可以

script_cmd bash -c 'charmm < setup_2zta.inp > setup_2zta.out'

function script_cmd() {
    c_echo YELLOW "\$ $@" >&2
    #                     ^^^
    eval "$@";
    #^^^
}

script_cmd 'charmm < setup_2zta.inp > setup_2zta.out'