Jak wielokrotnie przełączać się między dwoma (lub więcej) poleceniami?

0

Chciałbym wielokrotnie powtarzać, zmieniać i / lub przełączać się między wieloma poleceniami; w rodzaju wzoru lub pętli. Pożądany efekt końcowy można uznać za zupełnie odmienny watch.

Eksperymentowałem z odmianami tej podstawowej formuły; ale czegoś brakuje, źle lub w inny sposób:

for x in {1..60}; 
do 
    <first command> && 
    sleep 1 && 
    <second command>; 
done

Myślę, że to tylko powtórzenie ( doing) <first command> &&sześćdziesiąt razy, a następnie wszystkie kolejne operacje tylko raz, jak zwykle. Próbowałem kilku różnych rzeczy; jak używanie {nawiasów klamrowych }, 'cytatów ', "cytatów "i tak dalej; próbując zgrupować polecenia razem, bez powodzenia.

tjt263
źródło
1
&&Może być problem, ponieważ wymaga udanego status wyjścia. Czy chcesz, aby zakończyło się pierwsze polecenie, a następnie, jeśli pierwsze polecenie zakończyło się powodzeniem, zrób to sleep 1, lub wykonaj je, sleep 1dopóki pierwsze polecenie zakończy się w tle, niezależnie od kodów wyjścia?
agc

Odpowiedzi:

0

To działa dla mnie:

    for x in {1..60}; 
    do echo "1" &&
    sleep 1 &&
    echo "3"; 
    done

Działa to również dla mnie:

    for x in {1..60}; 
    do echo "1";
    sleep 1;
    echo "3"; 
    done

Jakie są twoje pozostałe dwa polecenia?

MikeD
źródło
0

Jednym prostym sposobem na to jest umieszczenie każdego polecenia w elemencie tablicy:

commandlist=('echo "hello"' 'echo "howdy"')

A następnie iteruj:

for x in {1..10}; do 
    index=$((x%2))  # % takes the modulus (or remainder) of integer division
    ${foo[$index]}
    sleep 1
done

${foo[0]}rozwija się do echo "hello", który jest następnie wykonywany.

DopeGhoti
źródło
0

Można to również zrobić w trybie bash lub zsh w trybie emacsa poprzez control+o:

$ set -o emacs
$ echo a
a
$ echo b
b
$ echo c
c

Następnie użyj nawigacji historii, aby dostać się do polecenia echo a(lub odpowiedniego), a następnie control+okilka razy. Polecenia z miejsca, w którym przeszedłeś do ostatniego, należy powtórzyć i zapętlić dla każdego z nich ponownie control+o.

gałązka
źródło
0

W porządku, chyba to rozgryzłem.

Myślę, że muszę tylko dodać kolejną && sleep 1pomiędzy <second command>i ; done.

Coś jak:

for x in {1..60}; 
do 
    <first command> && 
    sleep 1 && 
    <second command> &&
    sleep 1; 
done
tjt263
źródło
Nie powinno to mieć wpływu na zakończenie drugiego polecenia, chyba że oba polecenia mają jakiś nieujawniony konflikt zasobów.
agc
@agc „.. nie powinno mieć wpływu na to, czy drugie polecenie się zakończy…” To jest dokładne stwierdzenie. Ale nie sądzę, żeby to był kiedykolwiek problem.
tjt263
Dlaczego po prostu nie robisz set -ena początku i nie rezygnujesz z nich &&?
@RakeshSharma Nie wiem, co to jest ani jak to działa. Po prostu wykorzystuję to, czego do tej pory się nauczyłem, w sposób, w jaki to rozumiem. Chociaż, tak naprawdę nie znaleźć zastosowanie operatorów, jak &&, ||i ;aby być uciążliwe lub cokolwiek; Trochę lubię wskazówki wizualne.
tjt263,
@RakeshSharma Ale zdecydowanie staraj się rozwinąć swój pomysł.
tjt263