Jump to content

Analiza znaków/tekstu w terminalu. Jak?


Recommended Posts

Kontynuacja innego tematu o wysyłaniu znaku "y" i enter do terminala do interaktywnej komendy.

Jeśli jest komenda interaktywna jak:

dnf check-update <lista pakietów do aktualizacji>

która kończy się pytaniem [y/N] to nie jestem w stanie analizować pojawiającego się tekstu (np.  | grep -q "[y/N]" ) dopóki nie zakończę wybierając "y" lub domyślne Enter dla "N".

Jak przechwycić pojawienie się [y/N] w terminalu? Przechwycić, aby wyświetlić pytanie kdialog --yesno.

 

Radek Glebicki

 

Link to comment
Share on other sites

Narzędzie expect. 

 

#!/usr/bin/expect

# Uruchom polecenie, np. dnf check-update <lista pakietów>
# Możesz przekazać argumenty do skryptu
set cmd [lindex $argv 0]
set args [lrange $argv 1 end]

# Uruchom program w pseudoterminalu
eval spawn $cmd $args

# Oczekuj na pytanie (dopasuj wzorzec do tego, co faktycznie wyświetla dnf)
expect -re {\[y/N\]} {
    # Pytanie się pojawiło – pokaż okno kdialog
    # --yesno zwraca 0 dla Tak, 1 dla Nie
    set user_choice [exec kdialog --yesno "Czy chcesz kontynuować?"]
    if {$user_choice == 0} {
        send "y\r"       # wyślij 'y' i Enter
    } else {
        send "\r"        # sam Enter = domyślnie N
    }
}

# Przekaż dalsze wyjście programu (np. listę pakietów) na stdout
# i poczekaj na zakończenie
expect eof

 

Zapisujesz jako dnf-with-kdialog.exp 

uruchamiasz 

./dnf-with-kdialog.exp "dnf check-update" pakiet1 pakiet2

spawn tworzy nowy proces z przypisanym PTY.expect czyta wyjście z tego PTY (łącznie z pytaniem).Gdy wzorzec zostanie dopasowany, możesz uruchomić dowolne polecenie zewnętrzne (exec kdialog ...).Na podstawie odpowiedzi użytkownika wysyłasz dane z powrotem do PTY (send).

Odpal sobie dowolną AI, to ci będzie pomagać w takich rzeczach. 

  • Upvote 1
Link to comment
Share on other sites

Czytałem o "expect". Trochę mnie przerosło zrozumienie działania. Tutaj jest wytłumaczone. Dzięki. Ok, pytanie. Jak niby miało by wyglądać zapytanie dla AI do wygenerowania takiej odpowiedzi jak powyższa?

 

Radek

Link to comment
Share on other sites

  • 4 weeks later...
W dniu 11.04.2026 o 06:02, Radosław napisał:

Kontynuacja innego tematu o wysyłaniu znaku "y" i enter do terminala do interaktywnej komendy.

Jeśli jest komenda interaktywna jak:

dnf check-update <lista pakietów do aktualizacji>

która kończy się pytaniem [y/N] to nie jestem w stanie analizować pojawiającego się tekstu (np.  | grep -q "[y/N]" ) dopóki nie zakończę wybierając "y" lub domyślne Enter dla "N".

Jak przechwycić pojawienie się [y/N] w terminalu? Przechwycić, aby wyświetlić pytanie kdialog --yesno.

 

Radek Glebicki

Czasem, gdy czekasz na reakcję terminala i masz chwilę przerwy, można wykorzystać ją na małą odskocznię – np. szybka gra online w mostbet casino app, żeby nie myśleć o problemach z automatyzacją komend, zanim ruszysz dalej.

Cześć Radek,

w Twoim przypadku problem wynika z tego, że interaktywna komenda blokuje strumień, dopóki nie odpowiesz, więc standardowe grep czy awk nie zadziałają w czasie rzeczywistym. Są dwa główne podejścia do przechwycenia takiego pytania:expect – narzędzie do automatyzacji interaktywnych programów:

#!/usr/bin/expect -f

spawn dnf check-update <lista_pakietów>
expect {
    "*[y/N]*" {
        exec kdialog --yesno "Czy kontynuować aktualizację?"
        send "y\r"
    }
}
interact


spawn uruchamia komendę.
expect czeka na pojawienie się wzorca [y/N].
send "y\r" wysyła odpowiedź „y” (Enter dodaje \r).
interact pozwala dalej kontrolować terminal ręcznie, jeśli potrzeba.
Automatyzacja przez flagi komendy, jeśli dostępne:
Niektóre programy (w tym dnf) mają flagę nieinteraktywnego potwierdzania, np. -y:

dnf check-update -y

Wtedy terminal nie czeka na [y/N] i można analizować wynik od razu.

Podsumowując: jeśli chcesz reagować na pojawiające się pytanie w czasie rzeczywistym, expect jest najbezpieczniejszym rozwiązaniem, bo standardowe potoki Bash nie przechwycą interaktywnych promptów w trakcie działania.

  • Upvote 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...