bash ps comamnd возвращает ошибку при выполнении из строки

Итак, кто может объяснить это поведение:

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

Почему возникает ошибка, если я использую канал с этими командами и выполняю их как строку?

1 ответ

Это можно сделать с помощью eval, Имейте в виду, что это просто плохая практика программирования и усугубление eval может открыть сценарий оболочки, чтобы быть целью для атак произвольного выполнения кода. В частности, в случае оценки пользовательских аргументов, хотя имена файлов могут также использоваться для запуска этого. Что, как говорится:

cmd="ls -la | wc"
rv=$(eval $cmd)
echo "$rv"

Более популярной и безопасной практикой будет:

cmd1="ls -la"
cmd2="wc"

$cmd1 | $cmd2

Или еще лучше, можно использовать функции:

functiona()
{
    ls -la
}

functionb()
{
    wc
}

functiona | functionb
Другие вопросы по тегам