1

我需要在 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"

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

提前致谢。

全码

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

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 行和 B 行,两个版本都在那里,尽管一个被注释掉了.....

4

4 回答 4

2

您不能在带引号的字符串中包含 2> /dev/null 。处理重定向会删除引号。你必须做

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

以便重定向正常工作。

于 2012-07-12T19:46:39.477 回答
1

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

代替

 $cmd

你应该

 eval $cmd

事情就是这样运作的。

或者如果 echo 是为了调试,你可以在命令之前设置 -o xtrace 并在命令之后设置 +o xtrace 。并以正常方式而不是填充字符串。

于 2012-07-12T20:15:08.130 回答
0

我认为正在发生的事情是行内有一些我们看>不到的字符,或者是与它看起来不同的字符。毕竟shell应该在命令看到它之前吞下重定向,但是命令看到2>and /dev/nullas [PhysicalVolume [PhysicalVolume...]]。或者,重定向可以通过引用传递(因此它对 shell 失去了特殊含义并被传递),请参阅 chepner 的回答。


tonull=' 2 > /dev/null '

是问题。正如切普纳所猜测的那样。

于 2012-07-12T19:47:20.443 回答
-1

消除 2 和 > 之间的空格

pvs --noheadings -o pv_name,vg_name,vg_size 2>/dev/null
于 2012-07-12T19:24:04.540 回答