Nie wyświetla się wyświetlany komunikat o błędzie, ale prawdopodobnie jest to możliwe
grep: metoda nieznanych urządzeń
Dzieje się tak, ponieważ, podobnie jak wszystkie inne programy wiersza poleceń, grepzakłada, że wszystko, co zaczyna się na a, -jest opcją i próbuje je parsować jako takie. W takim przypadku -Dsłuży do instruowania, grepjak postępować z plikiem urządzenia (zobacz man grepszczegóły). Jednym ze sposobów obejścia tego jest użycie, --które mówi, grepże cokolwiek następuje nie jest flagą opcji.
Łącząc to z funkcją GNU PCRE grep, możesz:
ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'
Wyrażenie regularne szuka a -i odrzuca je ( \K), a następnie ciąg znaków, Dapp.name=po którym następuje jak najwięcej znaków spacji, jak to możliwe. Dane wyjściowe to:
Dapp.name=myApp
Jeśli chcesz myAppzapisać część w zmiennej, szukałbym tego sam:
ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'
Aby przypisać ją do zmiennej:
$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp
Jednak nigdy nie powinieneś uzyskiwać greprezultatów psdla tego rodzaju rzeczy, właśnie po to pgrep:
app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"
grepwzór zaczyna się od-, musisz umieścić go po-eopcji. W przeciwnym razie będzie to traktowane jako opcja. Ale to po prostu pasuje do słowa-Dapp.name, a nie do części po nim.