Jak wykonać skrypt bash wiersz po wierszu?


Odpowiedzi:


130

Nie musisz umieszczać odczytu w każdym wierszu, po prostu dodaj do swojego skryptu basha pułapkę, taką jak poniżej, ma to efekt, który chcesz, np.

#!/usr/bin/env bash
set -x
trap read debug

< YOUR CODE HERE >

Działa, właśnie przetestowałem go z bash v4.2.8 i v3.2.25.


POPRAWIONA WERSJA

Jeśli Twój skrypt odczytuje zawartość z plików, powyższe elementy nie będą działać. Sposób obejścia może wyglądać jak w poniższym przykładzie.

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

< YOUR CODE HERE >

Aby zatrzymać skrypt, w tym przypadku musiałbyś go zabić z innej powłoki .


ALTERNATYWA 1

Jeśli chcesz po prostu odczekać kilka sekund przed przejściem do następnego polecenia w skrypcie, może Ci się przydać następujący przykład.

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG

< YOUR CODE HERE >

Dodaję set + x i set -x w poleceniu trap, aby dane wyjściowe były bardziej czytelne.


1
Jak więc przejść do następnej linii (uruchomić następną komendę)?
David Doria,

2
Przechwytuje odczyt przy każdym poleceniu. Jedyne, co musisz zrobić, to nacisnąć klawisz Return, aby przejść do następnego polecenia
organic-mashup

1
jeśli masz takie linie poleceń "while read line; do echo $ line; done <somefile" ta metoda nie działa, ponieważ "trap read DEBUG" czyta wiersz z jakiegoś pliku
mug896

3
Jak to zatrzymać? Po przejściu przez skrypt do końca powłoka zachowuje się tak, jakby skrypt nadal działał.
slashdottir

1
Zmień na, trap 'read -u1' debugaby zastąpić problem z przekierowaniem odczytu pliku.
user3132194

23

Może BASH Debugger jest dla Ciebie.


3
To naprawdę najlepsze rozwiązanie. Umożliwia przeglądanie linii przed jej uruchomieniem (i wiele więcej). W większości systemów można go zainstalować z apt-get install bashdb. Następnie wystarczy uruchomić bashdb your_command.sh, wpisać step, a następnie nacisnąć klawisz powrotu karetki.
studgeek

1
@studgeek nie jest dostępny na Redhat / CentOS itp., więc nie nazwałbym tego „większością systemów”.
Sajuuk,

@Sajuuk, może nie jest zapakowany , ale jest absolutnie dostępny .
Charles Duffy,

macOS:brew install bashdb
boweeb

@CharlesDuffy: nie ma go również w domyślnych repozytoriach Ubuntu.
Dan Dascalescu

2

Jeśli twój skrypt bash to naprawdę zbiór pojedynczych poleceń, które chcesz uruchamiać pojedynczo, możesz zrobić coś takiego, które uruchamia każde polecenie jedno po drugim, gdy zwiększasz zmienną LN, odpowiadającą numerowi wiersza, który chcesz uruchomić . Dzięki temu możesz po prostu ponownie uruchomić ostatnie polecenie, bardzo łatwo, a następnie po prostu zwiększyć zmienną, aby przejść do następnego polecenia.

Zakładając, że Twoje polecenia znajdują się w pliku „it.sh”, uruchom kolejno następujące polecenia.

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd


1

xargs: może filtrować linie

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 Traktuj jako surowe dane wejściowe (bez ucieczki)
  • -l Oddziel każdy wiersz (domyślnie nie dla występów)
  • -d \\ n Separator linii
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.