作者:殉情放开那只小兔子 | 来源:互联网 | 2022-10-22 11:33
我正在尝试在脚本中为用户添加某种“详细程度”选项。
也就是说,当用户-v
向我的脚本添加参数时,脚本应该吐出命令通常执行的所有操作stdout
。如果没有-v
,则stdout
除了我要手动echo
通知用户有关正在运行的命令的内容外,什么都不应打印。
这是我的想法和实现-
V
在
类似脚本的每个命令的末尾附加一个变量dd if=/dev/zero of=${XYZ} bs=1M count=5 ${V}
检查-v
用户的选项,如果该选项不存在,则分配/dev/null
给V
否则V
为null。
脚本片段:
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
无论如何都为null,因此命令将打印它打印的常规内容。
问题:
当我运行脚本时,命令dd
(或与此有关的任何其他命令)被视为${V}
一个参数,并抱怨不理解它
Creating Disk Image:dd: unrecognized operand ‘>/dev/null’
更让我困惑的是,当我/dev/null
在dd
命令中硬编码时
dd if=/dev/zero of=${XYZ} bs=1M count=5 >/dev/null
,它按预期运行(即没有输出打印)。
如果有人能对上述行为有所了解并提出建议,将不胜感激。
谢谢!
1> John1024..:
如果要使输出静音(stdout
),请运行:
exec >/dev/null
如果要使某些命令静音,而不要使其他命令静音,请保存stdout的副本并根据需要重定向:
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"