如何更改bash脚本的`echo`输出?

时间:2019-02-06 16:01:54

标签: linux bash shell cs50

我的问题在于,我需要使用在大多数GNU /上都可以使用的工具(如echosed)来更改以awk打印的bash脚本的输出。 Linux发行版,如果可能,也可以在MacOS X上发行。

该脚本在CS50 IDE上可用,称为apache50,其用法输出为:

Usage: apache50 [start VHOST_DIR|restart|reload|stop|status]

我要打印的输出是:

Usage: cli webserver [start VHOST_DIR|restart|reload|stop|status]

要执行apache50,我将指令作为参数传递给函数,然后尝试更改产生的输出:

optional_args(){
    ${@:2} | sed 's/apache50/cli webserver/g'
}

case $opt in:
    webserver)
        optional_args $opt "apache50" $@
        break;
        ;;
esac

## output:
## Usage: apache50 [start VHOST_DIR|restart|reload|stop|status]

我的脚本没有打印所需的输出。

这是apache50的一部分:

usage() {
    echo "Usage: `basename $0` [start VHOST_DIR|restart|reload|stop|status]" 1>&2
    exit 1
}

case "$1" in
    *)
        usage
    ;;
esac

如果您知道如何做得更好,请给我一个建议!

1 个答案:

答案 0 :(得分:1)

用法信息可能会打印为标准错误,而sed仅处理标准输入(在管道的另一侧,是命令的标准 output )。

您可以将标准错误重定向到标准输出:

${@:2} 2>&1 | sed 's/apache50/cli webserver/g'

但这会与最初的意图相冲突(例如,显示一条错误消息以及使用信息。)