Jeśli wpiszę opcję bash -x , to pokaże całą linię. Ale skrypt będzie działał normalnie.
Jak mogę wykonać wiersz po wierszu? Następnie mogę zobaczyć, czy działa poprawnie, czy też przerywam i naprawiam błąd. Ten sam efekt występuje read
w każdej linii.
Odpowiedzi:
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.
źródło
trap 'read -u1' debug
aby zastąpić problem z przekierowaniem odczytu pliku.Może BASH Debugger jest dla Ciebie.
źródło
apt-get install bashdb
. Następnie wystarczy uruchomićbashdb your_command.sh
, wpisaćstep
, a następnie nacisnąć klawisz powrotu karetki.brew install bashdb
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
źródło
Spójrz na bash-stepping-xtrace .
Umożliwia przechodzenie xtrace.
źródło
xargs: może filtrować linie
źródło