Ви не показуєте повідомлення про помилку, яке ви отримуєте, але це, ймовірно,
grep: метод невідомих пристроїв
Це тому, що, як і всі або принаймні більшість інших програм командного рядка, grepпередбачається, що все, що починається з а, -є варіантом і намагається проаналізувати його як таке. У цьому випадку -Dвикористовується для вказівки grepщодо того, як поводитися з файлом пристрою (див. man grepПодробиці). Одним із способів подолати це є використання, --яке говорить grepпро те, що все, що випливає, - це не прапор опції.
Поєднавши це з можливістю PCRE GNU 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, а не частині після нього.