Czy istnieje sposób na uruchomienie polecenia (np. ps aux|grep someprocess
) N razy?
Coś jak:
run -n 10 'ps aux|grep someprocess'
Chcę go używać interaktywnie, nie publikuj skryptów.
Aktualizacja: Powód, dla którego o to pytam, jest taki, że pracuję na wielu komputerach i nie chcę importować wszystkich moich skasowanych skryptów itp. Do każdego pudełka, aby uzyskać tę samą funkcjonalność na każdym komputerze.
Odpowiedzi:
Nie sądzę, żeby komenda lub wbudowana powłoka istniała w tym celu, ponieważ jest to trywialny podzbiór tego, do czego
for
przeznaczona jest pętla Bourne'a, dlatego samodzielne wdrożenie takiego polecenia jest dość proste.Na początek możesz użyć fikcyjnej
for
pętli:Lub równoważnie zgodnie z sugestią JimB, używając wbudowanego Bash do generowania sekwencji:
Powoduje to dziesięciokrotne wykonanie za
command
każdym razem - może to być potok lub seria poleceń oddzielonych przez;
lub&&
. Możesz użyć tej$i
zmiennej, aby dowiedzieć się, w której iteracji się znajdujesz.Jeśli uważasz, że ten jednowierszowy skrypt jest skryptu i dlatego z jakiegoś nieokreślonego (ale być może ważnego) powodu jest niepożądany, możesz go zaimplementować jako polecenie, być może coś takiego na swoim.
Stosowanie:
Przykład:
źródło
for
jest wbudowanym bash do iteracji.seq
:{1..10}
.bashrc
if, jeśli{1..$number}
zostanie wymieniona`seq $number`
.ps aux | grep someprocess
wygląda na to, że chcesz oglądać zmiany programu przez określony czas. Eduardo udzielił odpowiedzi, która dokładnie odpowiada na twoje pytanie, ale istnieje alternatywawatch
:Zauważ, że umieściłem polecenie w pojedynczych cudzysłowach, aby uniknąć interpretacji polecenia przez powłokę jako „uruchom zegarek ps aux” i przepuszczaj wynik
grep someprocess
. Innym sposobem wykonania poprzedniego polecenia byłoby:Domyślnie
watch
odświeża się co dwie sekundy, które można zmienić za pomocą-n
opcji. Na przykład, jeśli chcesz mieć odstęp 1 sekundy:źródło
Dla żartu
źródło
for
wydaje się najlepszym sposobem. W każdym razie dzięki za odpowiedź.cmd ;!!
w jednej linii nie powtórzysz polecenia wprowadzonego przed bieżącą linią? Musiałyby to być dwa osobnehistory
wpisy.;
z&&
zatrzymać się na pierwszym niepowodzeniu.podobne do poprzednich odpowiedzi, ale nie wymaga pętli for:
wyjście potoku seq do xargs bez argumentów ani opcji
źródło
echo "hello" 1 2 3 4 5 6 7 8 9 10
. Musisz uruchomić xargs z-n 1
dla jednego procesu dla każdego wejścia (liczby) i-P 10
dla równoległego wykonywania (10 równoległych procesów). Kończąc zseq 10 | xargs -n 1 -P 10 echo
.Spróbuj tego:
Wymaga to wykonania polecenia w podpowłoce, co stanowi niewielki spadek wydajności. YMMV. Zasadniczo dostajesz polecenie „tak”, aby powtórzyć ciąg „ls” N razy; podczas gdy „head -n5” zakończył pętlę w 5 powtórzeniach. Ostatnia rura wysyła polecenie do wybranej powłoki.
Nawiasem mówiąc
csh
, powłoki mają wbudowanerepeat
polecenie. Możesz go użyć do wykonania polecenia w podpowłoce bash!źródło
Sposób POSIX
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
który można oczywiście przekształcić w jedną wkładkę:
i wydaje się być najbardziej przenośnym sposobem, a tym samym mniejszym prawdopodobieństwem sprawi, że instalujesz programy.
Poniższe są mniej przenośne:
{1..10}
: specyficzna dla bash, i generowałaby ogromną linię, jeśli argument jest dużyseq
: GNUyes
: GNUA jeśli zmęczy Cię przenośność, rozważ GNU
parallel
:który uruchamia polecenia równolegle i ma wiele fajnych opcji.
Zobacz także: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash
źródło
sh, zsh, ksh
ibash
wszystkie są dobrze obsługiwane na większości platform.csh, tcsh, fish
ma pewne wsparcie. Za pomocąparallel --embed
możesz nawet zbudować skrypt, który można łatwo przenieść do innego systemu, w którym nie ma zainstalowanego GNU Parallel.Implementacja powłoki ryby powyższej
run
funkcji @ eduardo-ivanecźródło
Byłby to „zegarek” - powinien być częścią prawie każdego systemu uniksowego używającego procps
Możesz zobaczyć zmiany w systemie lub inny interesujący ruch w systemie. Na przykład,
Po prostu umieść swoje komendy jako argument (patrz
man watch
)źródło
W systemie macOS możesz użyć
repeat
polecenia.źródło