W Bash od czasu do czasu wpisuję listę poleceń i uderzam Enter, a dopiero później zdaję sobie sprawę, że istnieje błąd z niektórymi poleceniami na końcu listy. Wiem, że jeśli naciśniesz Ctrl+ C, zakończy to aktualnie działające polecenie i anuluje resztę listy. Czy jest jakiś sposób, aby anulować resztę listy bez kończenia aktualnie uruchomionego polecenia?
Załóżmy na przykład, że wpisałem coś takiego
foo; bar
lub
foo && bar
gdzie foo
jest długo działające polecenie, że bardzo ważne jest, aby nie przerywać, i bar
robi coś nieodwracalnego i niepożądanego (powiedzmy shutdown -h now
lub rm -rf /
). Podczas gdy foo
nadal działa, czy istnieje ogólny sposób na powiedzenie powłoce, aby foo
skończyła, ale nie uruchamiała bar
później? (Tak, mogę zmienić uprawnienia bar
tak, że nie jest wykonywalny, ale nie jest to szczególnie wygodne, jeśli bar
jest coś takiego rm
, że chcę użyć w międzyczasie, nie będzie działać, jeśli nie własny bar
lub jeśli bar
jest wbudowana).
źródło
bar
polecenie nasome_command
:^bar^some_command
przed wykonaniem.Odpowiedzi:
Zauważyłem, że użycie programu CtrlZdo przejścia do procesu w tle rozwiązuje problem.
Dzięki @Arkadiusz Drabczyk za wskazanie go w komentarzach, które
foo; bar
nie dają kontroli w wymagany sposób.Następnie:
Polecenie zatrzymuje tylko pierwsze zadanie i
Sprowadza to tylko zadanie
foo
na pierwszy plan i kończy zadanie i kończy pracę.PS: Można to sprawdzić za pomocą dwóch skryptów zapisujących do pliku. Pierwszy śpi przez kilka sekund, aby dać czas na powrót.
Jestem zagubiony, dlaczego CtrlZobsługuje tylko to polecenie i pozostawia resztę. Chciałbym się dowiedzieć.
źródło
bash
wersji używasz? UżywamGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. Napisałem 2 skrypty bash, które zapisują różne plikiwrite1.sh
:: pastebin.com/rbKmdWgB iwrite2.sh
: pastebin.com/bNx3VRws . Prowadzę je tak:./write1.sh ; ./write2.sh
. Pierwszy skrypt powtarzawrote 1
się kilka razy, naciskamC-z
, mówi[1]+ Stopped ./write1.sh
i od razu widzę wynik drugiego skryptu:wrote 2
powtarzany wielokrotnie.command1 && command2
rurociągami, jestControl-z
wysyłanieSIGCHLD
sygnału do procesu. Można to sprawdzić za pomocąecho $?
.Bash
następnie widzi, że pierwszy proces nie zakończył się pomyślnie i nie wykonuje kolejnych procesów.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Tak, myślę, że masz rację.foo; bar
nie można kontrolować w pożądany sposób. Ale możemy wykonać wymagane zatrzymanie drugiego procesu,Ctrl+Z
jeśli polecenie jest uruchomionefoo && bar
. Zaktualizuję odpowiedź. Dziękujemy za zwrócenie na to uwagi.bar
wciąż jest zawieszony i pojawia się w wynikachjobs
, więc prawdopodobnie również powinien zostać zabity.