如何在变量中存储对STDOUT / STDERR的引用

时间:2018-02-08 00:43:37

标签: bash shell stdout stderr

我可以像这样调用shell脚本:

foo --out-file=build/logs/foo.out --err-file=build/logs/foo.err

并在

脚本我有类似的东西

#!/bin/bash
OUTFILE=null
ERRFILE=null

while [[ $# -gt 0 ]]
do
  key="$1"

  case $key in
    -o|--out-file)
    OUTFILE=$2
    shift
    shift
    ;;
    case $key in
    -e|--err-file)
    ERRFILE=$2
    shift
    shift
    ;;
    *)
    shift
    ;;
  esac
done
if [ "$OUTFILE" != null ] && [ "$ERRFILE" != null ]
then
  ls > $OUTFILE 2>$ERRFILE
elif [ "$OUTFILE" != null ]
then
  ls > $OUTFILE
elif [ "$ERRFILE" != null ]
then
  ls 2>$ERRFILE
else
  ls
fi

有没有办法设置OUTFILEERRFILE将值保存到STDOUT / STDERR,这样我就可以将它们初始化为({。{{1}如果/ elif / else语句可以避免这样的人吗?

1 个答案:

答案 0 :(得分:2)

您可以执行的是使用exec命令执行重定向,该命令会重定向脚本的其余部分。

while [[ $# -gt 0 ]]
do
  key="$1"

  case $key in
    -o|--out-file)
        exec >"$2"
        shift 2
        ;;
    -e|--err-file)
        exec 2>"$2"
        shift 2
        ;;
    *)
        shift
        ;;
  esac
done

然后ls命令将写入文件,而不需要自己的重定向。