SH 条件重定向

SH 条件重定向

我希望能够/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

我不知道shbash(不一样!)你需要使用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

相关内容