Co to znaczy „… | polecenie ps `cat`” zrobić?

10

Podczas moich badań w Internecie znalazłem następujące polecenie jako rozwiązanie, aby znaleźć nazwę procesu okna:

xprop _NET_WM_PID | sed 's/_NET_WM_PID(CARDINAL) = //' | ps `cat`

Po prostu nie rozumiem, co dzieje się tutaj po pierwszym |.

Załóżmy, że dane xprop _NET_WM_PIDwyjściowe 1000są identyfikatorem procesu. Co się potem dzieje? Dlaczego mamy catpo ps? Jestem trochę zmieszany.

Nowicjusz
źródło

Odpowiedzi:

15

xprop ... | sed ...jest wykonywany jako pierwszy, a następnie catodczytuje dane wyjściowe. Ze względu na użycie backicks, wyjście cat jest podstawiane w ps `cat`taki sposób, że polecenie staje się ps 1000.

Alternatywnym poleceniem prowadzącym do tego samego wyniku jest:

ps $(xprop _NET_WM_PID | cut -d= -f2)

Działa to w następujący sposób:

  1. Wykonaj, xprop _NET_WM_PIDaby pobrać identyfikator procesu okna. Po kliknięciu okna wyświetla coś takiego:

    _NET_WM_PID(CARDINAL) = 12345
    
  2. Podziel na =i weź drugie pole. cut -d= -f2pobiera _NET_WM_PID(CARDINAL) = 12345ciąg ze standardowego wejścia i zapisuje 12345na standardowe wyjście.
  3. Na koniec uruchom pspolecenie z $(...)podstawioną wartością wyjściową ...polecenia, które zostanie wykonane ps 12345. (uwaga dodatkowa: `...`można również użyć zamiast $(...), choć istnieją pewne różnice )
Lekensteyn
źródło
4
Interesująca „cera”, ta | command 'cat'(nie mogę osadzić backticka w backtick w komentarzach?) ... zwykłym sposobem jest: | xargs command(z dodatkowymi parametrami do xargs, na przykład aby ograniczyć do 1 lub n argumentów itp.)
Olivier Dulac