我需要在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两个版本都在那里,虽然有一个被评论出来.....
答案 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