linux - bash ps 命令从字符串执行时返回错误

标签 linux bash ps

那么,谁能解释这种行为:

# 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)

如果我对这些命令使用管道并将它们作为字符串执行,为什么会出现错误?

最佳答案

这可以使用 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

关于linux - bash ps 命令从字符串执行时返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018345/

相关文章:

c - 如何正确使用 SO_RXQ_OVFL 检测 Linux 套接字上的 UDP 溢出?

linux - 将 nl 命令中的行增量设置为 float

bash - 更新文件中多个日期的日期格式

linux - 当应用程序在 Linux 中通过 crontab 运行时,Log4j2 日志记录不起作用

r - x86_64-conda_cos6-linux-gnu-ld : cannot find -lc

linux - 检查进程是否为 Go 应用程序(在 Linux/Unix 中)

json - Docker -- 带有 json 的格式。多个占位符的特定占位符语法

c - 我的服务器程序可以看作是进程 ps 输出中 S 的含义是什么

c++ - 新手 : Render RGB to GTK widget -- howto?

linux - 打印 file1 到 file2 的差异而不删除 file2 中的任何内容