我有一个脚本可以打印出几行文本。该文本被其他进程用作配置。
当我正常运行程序时,我将标准输出重定向到文件,这很好:
./generateConfig.sh > normal.cfg
但问题是,normal.cfg确实是恒定的,我想通过提供附加参数(如-o,没有参数参数)让用户选择打印到文件或在屏幕上。
如果脚本内容是:
#!/bin/bash
echo "8.8.8.8"
我如何参数化输出,以便根据参数将其打印到文件或标准输出?
这似乎不起作用:
#!/bin/bash
output="/dev/stdout"
if [ $# -gt 0 ]; then
output="normal.cfg"
fi
echo "8.8.8.8" > $output
答案1
几种做法:
一个功能
#! /bin/sh -
[ "$#" -gt 0 ] && redir=true || redir=false
redir() if "$redir"; then "$@" > normal.cfg; else "$@"; fi
redir echo 8.8.8.8
别名:
#! /bin/sh -
[ -z "$BASH_VERSION" ] || shopt -s expand_aliases
[ "$#" -gt 0 ] && alias redir='>normal.cfg' || alias redir=
redir echo 8.8.8.8
(不适用于posh
禁用的别名,或者如果来源(使用.
命令)在 AT&T 实现中ksh
)。
专用文件描述符:
#! /bin/sh -
[ "$#" -gt 0 ] && exec 3> normal.cfg || exec 3>&1
echo 8.8.8.8 >&3
(请注意,除了 ksh93 之外,没有多少 shell 在 fd 3 上设置 close-on-exec 标志,因此您可能需要关闭手动执行的命令)
答案2
您可以使用重定向整个脚本的输出exec
。
#! /bin/bash
if [[ $1 = -o ]]
then
exec > "$2"
fi
echo "8.8.8.8"
现在,如果您使用 运行脚本-o foo
,输出将位于文件 中foo
。
$ ./foo.sh
8.8.8.8
$ ./foo.sh -o bar
$ cat bar
8.8.8.8
答案3
尝试使用:
#!/bin/bash
output="normal.cfg"
if [ $# -gt 0 ];
then
echo "8.8.8.8" > $output
else
echo "8.8.8.8"
fi
如果你想做更复杂的事情,你可以尝试tee
命令:请参阅此处的示例。