如何添加详细选项来控制脚本输出?

时间:2019-06-02 17:07:48

标签: linux bash shell

我正在尝试在脚本中为用户添加某种“详细程度”选项。
也就是说,当用户在我的脚本中添加-v作为参数时,脚本应该在stdout上吐出命令通常执行的所有操作。如果没有-v,那么除了stdout我要手动echo来通知用户有关正在运行的命令的内容外,什么都不应在V上打印。

这是我的想法和实现-

  1. 脚本中每个命令的末尾都有变量dd if=/dev/zero of=${XYZ} bs=1M count=5 ${V}-
    -v
  2. 从用户那里检查/dev/null选项,如果该选项不存在,则将V分配给V,否则V=">/dev/null" while getopts "v" opt; do case $opt in v) V="" ;; esac done dd if=/dev/zero of=${XYZ} bs=1M count=5 ${V} 为空。

脚本片段:

V

因此,我希望将/dev/null设置为dd时,V命令将不会打印任何内容,否则dd仍然为null,因此该命令将打印通常的内容它打印。

问题:
当我运行脚本时,命令${V}(或与此相关的任何其他命令)将Creating Disk Image:dd: unrecognized operand ‘>/dev/null’视为自变量,并抱怨不理解它
/dev/null

当我在dd命令中对dd if=/dev/zero of=${XYZ} bs=1M count=5 >/dev/null进行硬编码时,更让我感到困惑的是
#if DEBUG //Do something on debug #endif ,它会按预期运行(即无输出打印)。

如果有人能对上述行为提出一些看法并提出相应建议,将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:5)

如果您想使输出静音(stdout),请运行:

exec >/dev/null

如果您想使某些命令静音而不是其他命令,请保存标准输出副本并根据需要重定向:

exec 6>&1         # Save current stdout as file handle 6
exec >/dev/null   # Silence stdout
date              # This command is silenced
exec >&6          # Restore stdout to its original destination
echo Hi           # This command will display

示例脚本

#!/bin/bash

# Save current stdout as file handle 6 and then set for silence
exec 6>&1
exec >/dev/null

# Process options
while getopts "v" opt; do
 case "$opt" in
 v) exec >&6 ;;
 esac
done

# Generate output
echo "Information out"

答案 1 :(得分:0)

我认为以不同的方式使用变量更容易,并且总是将每个命令的输出通过管道传递给处理程序。例如:

handle_out() {
    $V
}

while getopts "v" opt; do
 case $opt in
 v) V=cat ;;
 esac
done

dd if=/dev/zero of=${XYZ} bs=1M count=5 | handle_out

请注意,如果未指定“ v”选项,则handle_out函数中的$ V为空。这将使handle_out充当数据接收器。如果指定了“ v”选项,则handle_out会调用cat,后者只会将输出发送到STDOUT。