我希望能够/dev/null
根据命令行开关重定向脚本的某些输出。我不知道该怎么做。
以一种愚蠢的方式,它将会是这样的(以一种过于简单的方式):
#!/bin/sh
REDIRECT=
if [ $# -ge 1 -a "$1" = "--verbose" ]; then
echo "Verbose mode."
REDIRECT='1>&2 > /dev/null'
fi
echo "Things I want to see regardless of my verbose switch."
#... Other things...
# This command and others along the script should only be seen if I am in verbose mode.
ls -l $REDIRECT
请问有什么线索吗?
谢谢大家。
答案1
如果您处于详细模式,请将 STDOUT 绑定到另一个句柄,否则将这些句柄链接到 /dev/null。然后编写脚本,使可选内容指向额外的句柄。
#!/bin/sh
exec 6>/dev/null
if [ $# -ge 1 -a "$1" = "--verbose" ]; then
echo "Verbose mode."
exec 6>&1
fi
echo "Things I want to see regardless of my verbose switch."
#... Other things...
# This command and others along the script should only be seen if I am in verbose mode.
ls -l >&6 2>&1
这应该可以让你入门了。我不确定这是否是 BASH 特有的。这只是很久以前的记忆。;-)
答案2
我不知道sh
但bash
(不一样!)你需要使用eval
:
$ x='> foo'
$ echo Hi $x
Hi > foo
$ eval echo Hi $x
$ cat foo
Hi
答案3
我认为你的测试是倒退的。你想重定向/dev/null
到不是在详细模式下:
if [ $# -ge 1 -a "$1" = "--verbose" ]; then
echo "Verbose mode."
else
REDIRECT='2>&1 >/dev/null'
fi