我如何有条件地将输出重定向到文件,具体取决于是否存在某些脚本参数?

时间:2015-07-10 18:56:26

标签: bash

我有一个脚本,我想用它来处理一些数据并将其输入到一个选定的文件中。

(do some stuff)>$(hostname)_$1

如果我的参数是文件名,这可以正常工作,但如果我想输出到终端,即stdout,我应该传递什么(或者我应该如何更改脚本?)

2 个答案:

答案 0 :(得分:3)

这个答案假定问题是:

  

如何有条件地将输出重定向到文件,具体取决于是否存在某个脚本参数?

换句话说,如何减少bash函数中的重复,如下所示:

do_it() {
  if [[ -z $1 ]]; then
      some very
      complicated
      commands
  else
      { some very
        complicated
        commands
      } > "$(logdir)/$1"
  fi
}

如果这是问题,一个简单的解决方案是在子shell中有条件地重定向stdout:

do_it() {
  (
    if [[ -n $1 ]]; then exec > "$(logdir)/$1"; fi
    some very
    complicated
    commands
  )
}

子shell(使用括号创建)是必要的,以便限制exec命令对函数范围的影响;否则,当函数返回时,重定向将继续。

答案 1 :(得分:0)

这对我很有效。如果 DUMP_FILE 为空,则内容转到标准输出,否则转到文件。它在不使用显式重定向的情况下完成这项工作,而只是使用管道和现有应用程序。

function stdout_or_file
{
    local DUMP_FILE=${1:-}

    if [ -z "${DUMP_FILE}" ]; then
        cat
    else
        sed -n "w ${DUMP_FILE}"
    fi
}

function foo()
{
    local MSG=$1
    echo "info: ${MSG}"
}

foo "bar" | stdout_or_file ${DUMP_FILE}

当然,你也可以把它挤在一行中

foo "bar" | if [ -z "${DUMP_FILE}" ]; then cat; else sed -n "w ${DUMP_FILE}"; fi

除了 sed -n "w ${DUMP_FILE}" 之外,另一个执行相同操作的命令是 dd status=none of=${DUMP_FILE}