我有一个脚本,您可以像这样运行它./myscript
,并且脚本内部调用的一些命令的输出被隐藏,就像这样:
if mvn tomcat:deploy &> /dev/null; then
但是如果像这样执行脚本,./myscript -v
您就可以看到命令的输出,因此它只是:
if mvn tomcat:deploy; then
首先,标准输出的值是什么,以便我可以存储该值或将其存储/dev/null
在变量中,以便进行如下调用:
if mvn tomcat:deploy &> $output; then
检查参数的最佳方法是什么?我是否需要逐字检查是否$1
等于文字-v
,或者有更好的方法(因为选项如此常用,我猜有不同的机制)?
答案1
我绝对建议使用 bashgetopts
来处理任何命令行选项 - 有一个wiki.bash-hackers.org 上的 getopts 小型教程我发现这非常有帮助。
对于输出重定向,您不需要存储文件描述符,而只需在脚本主体之前有条件地重定向流,或者(可能更干净)使用exec n>&-
where关闭流即可n是流的数字文件描述符(1 = stdout,2 = stderr)。
我认为,当命令运行时不带参数,保留输出会更自然,并且有一个-q
(安静)选项将输出转储到 /dev/null - 例如
#!/bin/bash
while getopts ":q" opt; do
case $opt in
q)
quiet=1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
if [ "${quiet:-0}" -ne 0 ]; then
exec 1>&- 2>&-
fi
#
# remainder of your script here
#
如果您确信想要做相反的事情(即默认将 stdout 和 stderr 发送到 /dev/null),那么您可以翻转逻辑。
答案2
您可以使用以下任一方式在脚本 shell 中命名标准输出:
1
/dev/stdout
/proc/self/fd/1
所有这些都只是说“文件描述符#1”的方式,它是用于输出的常规预先打开的数据接收器。
(实际上,重定向语法>
只是改变了预先打开的 fd,以便当子命令尝试写入 fd 1 时,它实际上会转到其他文件或设备。 >&
对两个描述符 1 = stdout 和 2 = stderr 执行相同的操作。)
如果您只有一个标志,那么检查一下就没问题了$1
。有几种方法可以进行命令行选项处理,但有一种强大的工具是getopt
。要熟悉它,请先查看/usr/share/doc/util-linux/examples/getopt-parse.bash
。