有问题执行命令执行在BASH脚本中抛出一个函数。
命令:[named -V|grep BIND|awk '{printf ($2);}']
在shell中工作,但不会将输出设置为varable。
$VER
的所需输出应为:9.8.1-P1
我认为问题是|
但是,我收到了:
BIND 9.8.1-P1 built with '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-gnu-ld' '--with-geoip=/usr' '--enable-ipv6' 'CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro' 'CPPFLAGS=-D_FORTIFY_SOURCE=2'
如果您有任何信息,请告诉我
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
function version {
if [ `builtin type -p $3` ]; then
VER=`$2`
if [[ -n $VER ]]; then
# echo "$VER" > $DIR/ver/$1
echo "VER=$VER"
PID=$(pidof $3)
if [[ -n "$PID" ]]; then
# echo "$PID" > $DIR/pid/$1
echo "PID=$PID"
fi
fi
else
echo "$1 not installed"
fi
}
version "bind" "named -V|grep BIND|awk '{printf ($2);}'" "named"
答案 0 :(得分:1)
您想要:VER=$(eval "$2")
- 引号对于将eval的脚本包含为单个单词非常重要。
您还需要更改第二个参数:
"named -V|awk '/BIND/ {print \$2}'"
# ^^^
如果没有反斜杠,shell会在双引号内看到$2
并替换它。
grep被删除只是因为没有必要:awk可以搜索模式。
答案 1 :(得分:1)
有关为什么命令不应存储在字符串中的详细讨论(以及在实践中失败的方式和原因),请参阅BashFAQ #50,并BashFAQ #48描述为什么eval
特别是错误易发。
更安全的方法是将代码存储在函数中,并按名称传递这些函数:
get_named_version() { named -V | awk '/BIND/ {print $2}'; }
version bind get_named_version named
...将与原始功能一起正常工作。