[英]Bash commands work on cmd line but not in script
我有一组在命令行上工作的管道命令,但是在脚本中运行时不会产生输出。
该命令是:
STRNG=$( ip mroute show | tr -d "()," | awk ' {print "/usr/sbin/smcroute -a eth3", $1, $2, "vtun0 vtun1"}' ); echo "$STRNG"`
输出为:
/usr/sbin/smcroute -a eth3 192.0.1.19 224.1.1.1 vtun0 vtun1
/usr/sbin/smcroute -a eth3 192.0.1.18 224.1.1.1 vtun0 vtun1
但是,如果将相同的命令行放入脚本中,则echo "$STRNG"
命令不会得到任何输出。
我想做的是将$STRNG
中的每一行作为命令执行,但是无论出于什么原因, $STRNG
似乎都没有在脚本中包含任何文本,而$STRNG
运行时$STRNG
确实包含了文本。 我敢肯定这是由于对bash的了解有限。
有人可以帮我吗?
管道中的命令之一是别名吗? 如果是这样,您需要做
shopt -s expand_aliases
为了让bash在脚本中扩展它。...通常,默认情况下,仅在交互式shell中启用此功能。
正如Scharron所说,用sh -x运行它。 除此之外:
我将它分成较小的部分进行调试。
即,首先具有执行此操作的脚本:
ip mroute show
运行脚本。 如果那产生了产出,那么就增加更多。
ip mroute show | tr -d "(),"
ip mroute show | tr -d "()," | awk ' {print $0 } '
ip mroute show | tr -d "()," | awk ' {print "/usr/sbin/smcroute -a eth3", $1, $2, "vtun0 vtun1"}'
我要感谢大家的帮助-这些将是将来需要的好东西。
我的脚本的第一行与命令行不同:
/usr/sbin/smcroute -k; /usr/sbin/smcroute -d
事实证明,每次从ip mroute show获得的结果都是不同的,可能是因为多播数据包尚未到达接口。 在第一行之后和ip mroute show
链之前添加一个sleep 1
修复它。
如果没有Fosco的帮助,我将找不到它,而且我之前也不知道如何调试或扩展别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.