Вы не видите сообщение об ошибке, которое вы получаете, но это, вероятно,
grep: метод неизвестных устройств
Это связано с тем, что, как и во всех или, по крайней мере, в большинстве других программ командной строки, grep
предполагается, что все, что начинается с a, -
является опцией и пытается проанализировать его как таковое. В этом случае -D
используется для указания grep
того, как обращаться с файлом устройства (см. man grep
Подробности). Одним из способов обойти это является использование, --
которое говорит, grep
что все, что следует, не является флагом опции.
Комбинируя это с возможностью GNU PCRE grep
, вы можете сделать:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
Регулярное выражение ищет a -
и отбрасывает его ( \K
), затем за строкой Dapp.name=
следует как можно больше непробельных символов. Выход:
Dapp.name=myApp
Если вы хотите, чтобы myApp
часть была сохранена в переменной, я бы искал это один:
ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'
Чтобы назначить его переменной:
$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp
Тем не менее, вы никогда не должны grep
выводить ps
для такого рода вещи, вот для чего pgrep
:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
grep
шаблон начинается с-
, вам нужно поставить его после-e
опции. В противном случае это будет рассматриваться как вариант. Но это будет соответствовать слову-Dapp.name
, а не части после него.