我正在尝试弄清楚如何使我运行的脚本更具可读性。我有多个命令,我想与实际输出分开。
我的第一个想法是使用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'