根据可选参数将输出重定向到 std 输出或 /dev/null

根据可选参数将输出重定向到 std 输出或 /dev/null

我有一个脚本,您可以像这样运行它./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

相关内容