那么,谁可以解释这种行为:
# rv=$(ps axu | grep logstash | grep -v grep)
# echo $rv
root 6190 8.5 5.9 2248344 242440 pts/0 Sl 16:30 2:09 /usr/bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Xmx500m -Xss2048k -Djffi.boot.library.path=/opt/logstash-1.5.4/vendor/jruby/lib/jni -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Xbootclasspath/a:/opt/logstash-1.5.4/vendor/jruby/lib/jruby.jar -classpath : -Djruby.home=/opt/logstash-1.5.4/vendor/jruby -Djruby.lib=/opt/logstash-1.5.4/vendor/jruby/lib -Djruby.script=jruby -Djruby.shell=/bin/sh org.jruby.Main --1.9 /opt/logstash-1.5.4/lib/bootstrap/environment.rb logstash/runner.rb agent -f /opt/logstash-1.5.4/config/logstash.conf
可是:
# cmd="ps axu | grep logs | grep -v grep"
# rv=$($cmd)
error: garbage option
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
没有管道也没问题。以下变体工作正常:
# cmd="ps axu"
# rv=$($cmd)
如果我使用带有这些命令的管道并将它们作为字符串执行,为什么会出错?
答案 0 :(得分:1)
可以使用eval
完成此操作。请注意,这实际上只是采取了糟糕的编程习惯并使其变得更糟,因为eval
可以打开一个shell脚本,以针对任意代码执行攻击。特别是在评估用户参数的情况下,尽管也可以使用文件名来触发它。话虽如此:
cmd="ls -la | wc"
rv=$(eval $cmd)
echo "$rv"
更受欢迎和安全的做法是:
cmd1="ls -la"
cmd2="wc"
$cmd1 | $cmd2
或者更好的是,可以使用函数:
functiona()
{
ls -la
}
functionb()
{
wc
}
functiona | functionb