Czy istnieje sposób na uruchomienie skryptu powłoki za pomocą echa poleceń, ale bez ich wykonania?
Załóżmy, że mam skrypt usuwający plik, którego nazwa jest przechowywana w zmiennej:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
Dodanie set -v
spowoduje wykonanie następujących poleceń przed wykonaniem:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Teraz chcę zobaczyć przepływ tego skryptu bez usuwania pliku. IOW, chcę zapobiec wpływowi na środowisko zewnętrzne i system plików. czy to możliwe?
Mógłbym zawinąć wszystkie polecenia za pomocą echo
polecenia, ale jest to męczące dla długiego skryptu.
linux
bash
shell-script
tak
źródło
źródło
Odpowiedzi:
Nie ma sposobu, aby przejść przez skrypt, aby zobaczyć, jak zadziałałby bez tego. W twoim przykładzie nie ma
if
instrukcji ani pętli. Ale w prawdziwych skryptach często występuje wiele instrukcji warunkowych. Wybór gałęzi zależy często od tego, co się wydarzyło, gdy powłoka uruchomiła poprzednie polecenie. Jeśli nie uruchomi polecenia, powłoka nie będzie wiedziała, jakie dane wyjściowe by wygenerował lub jaki byłby kod powrotu, od czego może zależeć następna gałąź warunkowa lub instrukcja przypisania.Jeśli chodzi o to, że chcesz dokładnie zbadać skrypt i wiedzieć, co robi, zanim go uruchomisz, nie jest to zły pomysł. Ale realistycznie, o najlepszym sposobem na to jest po prostu przeglądając plik z
less
lubvi
lub coś podobnego.Dodany
Jeśli opracowujesz skrypt i chcesz go wykonać po raz pierwszy, testując logikę, ale nie wyrządzając żadnych szkód, jeśli masz błąd, rozwiązaniem, którego często mogę użyć, jest modyfikacja tylko oświadczenia, które mogłyby wyrządzić jakiekolwiek szkody poprzez wklejenie
echo
w przód.Często działa to w typowych rzeczywistych skryptach, ponieważ (a) generowanie list elementów, które będziesz iterować lub wartość, dla której ustawisz zmienną, może być często wygenerowana bez zmiany systemu plików i (b) zwykle wystarcza Załóżmy, że wykonanie polecenia zakończy się powodzeniem.
źródło
trap read debug
który wykona odczyt po każdej wykonanej linii, a następnie możesz go przechodzić powoli, naciskając klawisz Enter (jest to przydatne, jeśli masz naprawdę długi skrypt i chcesz przetestować to po raz pierwszy).Myślę, że będziesz musiał powtórzyć echo - jednak jeśli umieścisz polecenie w zmiennej, możesz go włączyć i wyłączyć. Ponadto polecenie może być funkcją i tak złożoną, jak tylko chcesz.
źródło
D=eval
w części na żywo. Ale miła odpowiedź!Śledzisz przepływ za pomocą opcji -x dla bash, ale to nadal wykonywałoby polecenia.
Najlepsze, co możesz zrobić, to po prostu wysłać echo lub skomentować polecenia, które mają efekty zewnętrzne, takie jak rm. Przynajmniej nie musiałbyś zmieniać każdej linii.
źródło
Nie znam żadnej konkretnej metody suchego uruchamiania, ale możemy zastosować pewne środki ostrożności w celu zrozumienia nieznanego skryptu.
bash -n <script>
do sprawdzania składni . Z podręcznika gnu bash https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.
alias rm="rm -i" alias cp="cp -i" alias mv="mv -i"
Dla edytorów strumieniowych takich jak sedsed -i
(-i modyfikuje plik w miejscu bez -i, uruchamia na sucho dla sed, sprawdź szczegóły na stronie man) można skopiować pełne polecenie i uruchomić. Tuż przed właściwym poleceniem wyświetli wynik na ekranie, a następnie użyj polecenia, aby poczekać, aż dane wejściowe użytkownika będą kontynuowane. Przykładsed -i <pattern>
Zamień nased <pattern> read -p "Press any key..." sed -i <pattern>
Zawsze zaleca się również zachowanie punktów zapasowych w systemie, aby w razie awarii można było przywrócić dane.
źródło
Wykonaj
set –n
lub dołączn
do istniejącegoset –v
polecenia. Ale ponieważ powoduje to, że powłoka nie ocenia żadnych poleceń, nawet,if
lubwhile
, możesz nie uzyskać zbyt dobrego widoku przepływu operacyjnego.źródło
Oto mały konstrukt, którego lubię używać:
źródło
Jeśli chcesz zapobiec wprowadzaniu modyfikacji, możesz uruchomić skrypt jako użytkownik bez uprawnień:
W twoim przykładzie będzie to działać
FN="filename"
jak zwykle. Chociaż technicznie wykonuje to polecenierm -f ${FN}
, nic się nie stanie, jeśli nikt nie będzie miał niezbędnych uprawnień do usunięcia pliku.Oczywiście spowoduje to problemy z warunkowym przepływem pracy. Fakt, że
rm
polecenie nie powiodło się, może wpłynąć na dalsze części skryptu.źródło