我正在尝试在脚本中为用户添加某种“详细程度”选项。
也就是说,当用户在我的脚本中添加-v
作为参数时,脚本应该在stdout
上吐出命令通常执行的所有操作。如果没有-v
,那么除了stdout
我要手动echo
来通知用户有关正在运行的命令的内容外,什么都不应在V
上打印。
这是我的想法和实现-
dd if=/dev/zero of=${XYZ} bs=1M count=5 ${V}
--v
/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
,它会按预期运行(即无输出打印)。
如果有人能对上述行为提出一些看法并提出相应建议,将不胜感激。
谢谢!
答案 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。