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.


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?


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.


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.