如何将重定向字符("<"和">")传递给命令?

  • 本文关键字:命令 重定向 字符 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

您可以将彩色输出重定向到 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'

最新更新