需要将输出重定向到/ dev / null ....在命令行中工作正常但在shell中不能正常工作

时间:2012-07-12 19:21:38

标签: linux bash shell rhel5 lvm

我需要在bash文件中编写执行某些命令并忽略输入。

实施例

pvs --noheadings -o pv_name,vg_name,vg_size 2> /dev/null

上面的命令在命令行中效果很好,但是当我在shell中编写相同的命令时,它会给我一个错误

Failed to read physical volume "2>"
Failed to read physical volume "/dev/null"

我猜它看起来像是整个命令的一部分。你能否就如何纠正它给我一些建议?

提前致谢。

FULLCODE

#------------------------------

main() {
    pv_cmd='pvs'
    nh='--noheadings'
    sp=' '
    op='-o'
    vgn='vg_name'
    pvn='pv_name'
    pvz='pv_size'
    cm=','
    tonull=' 2 > /dev/null '
    pipe='|'

    #cmd=$pv_cmd$sp$nh$sp$op$sp$vgn$cm$pvn$cm$pvz$sp$pipe$tonull  #line A
    cmd='pvs --noheadings -o vg_name,pv_name,pv_size 2> /dev/null' #line B
    echo -n "Cmd="
    echo $cmd
    $cmd

}

#---------------------------------------------- -------

如果你看看A线和A线。 B两个版本都在那里,虽然有一个被评论出来.....

4 个答案:

答案 0 :(得分:2)

您不能包含2> / dev / null在引用的字符串中。处理重定向后,发生报价删除。你必须要做

cmd='pvs --noheadings -o vg_name,pv_name,pv_size'
$cmd 2> /dev/null

重定向正常工作。

答案 1 :(得分:1)

你做的方式,2>和/ dev / null将被解析为参数。但是你想要2> / dev / null是bash代码,而不是程序参数,所以

而不是

 $cmd

你应该

 eval $cmd

这就是事情的运作方式。

或者如果echo是用于调试的,你可以在命令之前设置-o xtrace并在其后设置+ oxtrace。并按正常方式进行,而不是填充字符串。

答案 2 :(得分:0)

我认为发生的事情是线条内部有一些字符对我们来说是不可见的,或者>是一个与它出现的字符不同的字符。在命令到达之前,所有shell都应该吞下重定向,但命令会将2>/dev/null视为[PhysicalVolume [PhysicalVolume...]]。或者,重定向可以被引用(因此它失去了对shell的特殊含义并被传递),请参阅chepner的答案。


tonull=' 2 > /dev/null '

是个问题。正如chepner猜测的那样。

答案 3 :(得分:-1)

消除2和>

之间的空格
pvs --noheadings -o pv_name,vg_name,vg_size 2>/dev/null