Ostatnio eksperymentowałem z ps
poleceniem i czasami długie ścieżki zawijają się do następnej linii (lub dwóch) i utrudniają czytanie. Chcę przesłać dane ps
wyjściowe do innego programu, aby ograniczyć wynik do x
liczby znaków.
Oto, co do tej pory mam, ale to nie działa całkiem dobrze:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
ocenia się na 167, ale nie wydaje się być poprawnym danymi wejściowymi dla cut
.
Czy istnieje sposób, aby ten typ składni działał w trybie bash?
tput rmam; ps aux
zsh
,ksh93
lubbash
przechowywać w terminalu szerokość$COLUMNS
Odpowiedzi:
Następujące prace:
Działa to również:
Wydaje się, że problem polega na tym
stty
, że tty musi mieć standardowe wejście, aby działać. Powyższe dwa podejścia rozwiązują ten problem.Jest jeszcze inna opcja. Podczas gdy
stty
stdin i stdout są przekierowywane w powyższych poleceniach, jego stderr nie jest: nadal wskazuje terminal. O dziwo,stty
zadziała również, jeśli jako dane wejściowe podano stderr:źródło
tee
został dodany podczas debugowania. Teraz już go nie ma.<&2
oznacza uzyskanie danych wejściowych ze standardowego błędu.stty
pobiera ustawienia terminalu na swoim standardzie (robisz to na przykład,stty < /dev/other-tty
aby uzyskać ustawienia innego terminalu). Więc nie jest dziwne, że to nie zadziała, jeśli jego stdin jest fajką lub<&2
działa.Niektóre muszle podoba
zsh
,bash
lubmksh
automatycznie ustawić$COLUMNS
zmienną szerokość terminala, więc nie trzeba powoływać sięstty
tutaj.Wszystkie implementacje,
ps
które wypróbowałem, obsługują tę niestandardową składnię (typ BSD), same sprawdzając szerokość terminala. Jestem zaskoczony, że twoje nie. Oczekuję jednak, że spojrzy na zawartość zmiennejCOLUMNS
środowiskowej .Więc możesz zrobić:
Jeśli nie,
Możesz także powiedzieć terminalowi, aby nie zawijał linii:
źródło
Możesz także
ps
lepiej obsługiwać dane wyjściowe.Dzięki temu
ps
w razie potrzeby zostanie przetworzone dane wyjściowe zgodnie ze specyfikacjami.Oczywiście, jeśli nie zawijasz słów, masz problem z brakującymi informacjami. Czy naprawdę potrzebujesz tego wszystkiego do wszystkich procesów? Otwórz go w pager, jeśli tak:
Jeśli nie, określ, co chcesz zobaczyć:
Alternatywnie możesz wyraźnie poinformować
ps
o swoim terminalu--width
:--width
Rzecz działa dokładnie w wybranym specyfikacji bez konieczności pociąga za sobą żadnych dodatkowych filtrów lub procesów pomocniczych (który będzie prawdopodobnie tylko zaśmiecać-aux
wyjście nawet więcej). I$COLUMNS
jak pokazano powyżej i jak wskazuje Stephane, będzie nawet działać dynamicznie.Warto jednak zauważyć, że często ludzie próbują dodawać tego rodzaju niepotrzebne filtry, aby umożliwić im przejście
|pipe
przez inny filtr w celu przeanalizowania wyników, co również może być niepotrzebne. Oczywiście przez ludzi mam na myśli przede wszystkim siebie.Argument
-o
utput, o którym wspomniałem powyżej, umożliwia filtrowanieps
wyświetlanych kolumn , a po dodaniu=
przypisania można nawet nazwać kolumnę według własnego uznania. Zostawiam zadanie puste i-p
podaję docelowy proces ,$pid
więc jedynym wyjściemps
jest$pid
nazwa polecenia i jegoargs
wywołanie. I-o
ledwo rysuje, jak można określić, cops
będzie wyświetlane, a czego nie. Oto kierunek, który poleciłbym ci wziąć, szczególnie poprzez:źródło