我需要在bash文件中编写一个execute some命令,并忽略输入。
示例
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}
main
#---
如果你看一下A和B行,两个版本都在那里,尽管其中一个被注释掉了……
发布于 2012-07-13 03:46:39
不能在带引号的字符串中包含2> /dev/null。在处理重定向之后,会删除报价。你要做的是
cmd='pvs --noheadings -o vg_name,pv_name,pv_size'
$cmd 2> /dev/null重定向才能正常工作。
发布于 2012-07-13 04:15:08
按照您的方式,2>和/dev/null将被解析为参数。但是您希望2> /dev/null是bash代码,而不是程序参数,因此
而不是
$cmd你应该
eval $cmd事情就是这样的。
或者,如果回显是为了调试,您可以在命令之前设置-o xtrace,并在命令之后设置+o xtrace。并以正常的方式来完成,而不是填充字符串。
发布于 2012-07-13 03:47:20
我认为发生的情况是,行中有一些字符对我们来说是不可见的,或者>是一个与它看起来不同的字符。毕竟,外壳程序应该在命令看到重定向之前接受它,但是命令将2>和/dev/null视为[PhysicalVolume [PhysicalVolume...]]。或者,重定向可以用引号传递(因此它失去了对shell的特殊意义并被传递),请参见chepner的答案。
tonull=' 2 > /dev/null '才是问题所在。正如切普纳猜测的那样。
https://stackoverflow.com/questions/11459100
复制相似问题