我有一个脚本,我想用它来处理一些数据并将其输入到一个选定的文件中。
(do some stuff)>$(hostname)_$1
如果我的参数是文件名,这可以正常工作,但如果我想输出到终端,即stdout,我应该传递什么(或者我应该如何更改脚本?)
答案 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}