bash:如果没有给出文件,则打印到文件或标准输出

时间:2016-09-28 16:02:24

标签: bash stdout

我如何模拟行为"如果未给出输出文件,则打印到stdout"在我自己的BASH脚本中?

我想模仿,例如, unix实用程序sort

sort  input   
# prints to stdout

sort  -o out  input
# prints to file "out".  does not print to stdout.

可悲的是,我唯一想到的是,在我的BASH脚本的最后:

if [ ! -z "$OUT" ]; then
    some | commands > $OUT
else
    some | commands 
    # prints to stdout
fi

2 个答案:

答案 0 :(得分:1)

如果您的异议是重复命令,如果没有给出其他文件名,您可以在重定向中使用/dev/stdout作为文件名。

output=${OUT:-/dev/stdout}
some | commands > "$output"

答案 1 :(得分:1)

如果我理解正确,您希望将shell脚本中的所有输出重定向到日志文件,如果" -o"存在或打印到stdout。请尝试以下脚本,

#!/bin/bash

OPTIND=1
LOG_FILE=""
while getopts "o:" opt; do
    case "$opt" in
    o)  LOG_FILE=$OPTARG
        ;;
    esac
done

shift $((OPTIND-1))
[ ! -z $LOG_FILE ] && exec >$LOG_FILE

echo "This line will be inside log file if -o <filename> is given"

如果您将上述脚本命名为&#34; parse.sh&#34;,则应使用

./parse.sh -o output.txt #This will store all logs/echos inside "output.txt"
./parse.sh #This will print all the logs/echos to stdout

如果您不使用多个输入参数,甚至可以直接访问&#34; $ 1&#34;

,您甚至可以避免使用getopts