我正在试图弄清楚如何制作一个我正在运行的脚本以使其更具可读性。我有多个命令,我想从实际输出中分离出来。
我的第一个想法是使用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
答案 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'