2014-09-03 78 views
0

我想要一个方式脚本来通过沉默标志在一个bash中,以便所有输出将被定向到/dev/null,如果它存在如果不是,则返回到屏幕。Bash:重定向到屏幕或/ dev/null取决于国旗

我的剧本的MWE是:

#!/bin/bash 

# Check if silent flag is on.  
if [ $2 = "-s" ]; then 
    echo "Silent mode." 
    # Non-working line. 
    out_var = "to screen" 
else 
    echo $1 
    # Non-working line. 
    out_var = "/dev/null" 
fi 

command1 > out_var 

command2 > out_var 

echo "End." 

我打电话有两个变量的脚本,第一个是不相关的,而第二个($2)是实际无声标志-s):

./myscript.sh first_variable -s 

显然out_var线不工作,但他们给我想要的东西的想法:以直销的方式的command1和输出根据-s是否存在与屏幕或/dev/null

我该怎么做?

+2

大约有'='壳任务没有空格。假设你想要默认的标准输出位置,如果你用'/ dev/stdout'替换''screen''并在重定向中使用'$ out_var',我相信你的脚本应该可以正常工作。 – 2014-09-03 02:21:30

+0

http://www.tldp.org/LDP/abs/html/io-redirection.html也是有趣的阅读。 – 2014-09-03 02:30:29

+0

大提示@EtanReisner! – Gabriel 2014-09-03 11:43:02

回答

3

您可以使用裸体exec命令重定向当前程序,而无需启动新程序。

因此,-s标志可以用类似处理:

if [[ "$1" == "-s" ]] ; then 
    exec >/dev/null 2>&1 
fi 

下完整的脚本显示了如何做到这一点:

#!/bin/bash 

echo XYZZY 

if [[ "$1" == "-s" ]] ; then 
    exec >/dev/null 2>&1 
fi 

echo PLUGH 

如果用-s运行它,你就会得到XYZZY但没有PLUGH输出(嗯,在技术上,你得到PLUGH输出,但它的发送到/dev/null位桶)。

如果你运行它没有-s,你会得到两条线。

echo语句之前和之后的语句显示exec正如所描述的那样工作,只是简单地改变当前程序的重定向而不是尝试重新执行它。


顺便说一句,我认为你的意思是“筛选”是“以目前的标准输出”,这可能如果它已经被重定向到是也可能不是实际的终端设备(例如别的地方)。如果你想要想要实际的终端设备,它仍然可以完成(例如使用/dev/tty),但这将是一个不寻常的要求。

+1

我提供了另一种观点,但我认为'exec'是OP的正确方法。但是,在更长的脚本中,exec可能会对管道产生令人惊讶的后果,或者如果想要将输出发送回原始接收器。好答案! – 2014-09-03 02:23:26

1

有很多东西可能是错误的,你的脚本;我不会试图猜测,因为你没有发布任何实际的输出或错误。

不过,也有几件事情,可以帮助:

  1. 你需要弄清楚您的输出是真的。标准输出和标准错误是两个不同的东西,重定向一个不一定会重定向另一个。

  2. 在bash中,你可以将输出发送到的/ dev /标准输出的/ dev /标准错误,所以你可能想尝试这样的:

    # Send standard output to the tty/pty, or wherever stdout is currently going. 
    cmd > /dev/stdout 
    
    # Do the same thing, but with standard error instead. 
    cmd > /dev/stderr 
    
  3. 标准错误重定向到标准输出,然后将标准输出发送到/dev/null。订单在这里重要。

    cmd 2>&1 > /dev/null 
    

可能还有其他的问题,你的脚本,但出于与Bash shell redirections问题GNU Bash的手册是信息的权威来源。希望能帮助到你!

0

如果您不想重定向脚本中的所有输出,则可以使用eval。例如:

$ fd=1 
$ eval "echo hi >$a" >/dev/null 

$ fd=2 
$ eval "echo hi >$a" >/dev/null 
hi 

请务必使用双引号,这样的变量被替换eval评估之前。

0

就你而言,你只需要将out_var = "to screen"更改为out_var = "/dev/tty"即可。而且使用这样command1 > $out_var(见“$”你所缺乏的)

我实现它像这样

# Set debug flag as desired 
DEBUG=1 
# DEBUG=0 

if [ "$DEBUG" -eq "1" ]; then 
    OUT='/dev/tty' 
else 
    OUT='/dev/null' 
fi 

# actual script use commands like this 
command > $OUT 2>&1 

# or like this if you need 
command 2> $OUT 

当然,你也可以从一个命令行选项设置调试方式,请参阅How do I parse command line arguments in Bash?

而且你可以有多个调试或详细级别这样

# Set VERBOSE level as desired 
# VERBOSE=0 
VERBOSE=1 
# VERBOSE=2 

VERBOSE1='/dev/null' 
VERBOSE2='/dev/null' 

if [ "$VERBOSE" -gte 1 ]; then 
    VERBOSE1='/dev/tty' 
fi 

if [ "$VERBOSE" -gte 2 ]; then 
    VERBOSE2='/dev/tty' 
fi 

# actual script use commands like this 
command > $VERBOSE1 2>&1 

# or like this if you need 
command 2> $VERBOSE2