Puncte:0

Cum să citești cu timeout fără ca bash să considere o eroare?

drapel us

Am un script read_user_input.sh:

#!/bin/bash

# set -e

prompt="bla? [D/n] "

în timp ce adevărat; do
    citește -p „$prompt” -n 1 -s -t 3 răspuns
    caz $reply in
        ""|Y|y) ecou "bla!!!"; pauză;;
        N|n) echo "nu bla :( esti nasol"; break;;
        *) ;;
    esac
Terminat

Funcționează așa cum mă așteptam - de ex.

  • Utilizatorul introduce „Y” -> bla
  • Utilizatorul introduce „y” -> bla
  • Utilizatorul apasă Enter -> bla
  • Timeout -> bla

Cu toate acestea, atunci când adăugați set -e - citirea se termină cu eroare > 128.

Din citește --ajutor:

Stare de ieșire:

Codul de returnare este zero, cu excepția cazului în care se întâlnește sfârșitul fișierului, timp de citire expirat (caz în care este mai mare de 128), apare o eroare de atribuire a variabilei, sau un descriptor de fișier nevalid este furnizat ca argument pentru -u.

Care ar fi cel mai bun mod de a depăși acest lucru?

  1. adăugând || Adevărat nu pare corect, deoarece ar ascunde orice erori reale.
  2. De asemenea, nu vreau să elimin set -e.
  3. Un alt lucru la care m-am gândit a fost să mă descurc capcană dar asta pare a fi exagerat
Puncte:2
drapel tm

În loc să adauge || Adevărat, Seteaza $reply la y dacă a existat un timeout:

    citește -p „$prompt” -n 1 -s -t 3 răspuns || {
        err=$?
        dacă (( $err > 128 )) ; atunci
            răspuns=y
        altfel
            ieșire $err
        fi
    }
CIsForCookies avatar
drapel us
L-am folosit puțin diferit, astfel încât să se potrivească cu carcasa mea de comutare
drapel tm
Am actualizat răspunsul astfel încât codul de ieșire să corespundă cu cel original, nu cu cel care vine de la `$? > 128`.
CIsForCookies avatar
drapel us
Cred că răspunsul meu dă același rezultat
drapel tm
Încercați să schimbați `read` în `XXXread` și vedeți ce cod de ieșire obțineți de la ambele versiuni.
CIsForCookies avatar
drapel us
versiunea mea există, ceea ce este ideal
drapel tm
Da, dar cu codul 1 în loc de 127.
Puncte:0
drapel cn

Aici este un hack în care este folosită substituția de comandă care furcă un subshell unde -e nu este activat.

#!/bin/bash

set -e

prompt="bla? [D/n] "

în timp ce adevărat; do
    case $(citește -p "$prompt" -n 1 -s -t 3 răspuns; echo $răspuns) în
        ""|Y|y) ecou "bla!!!"; pauză;;
        N|n) echo "nu bla :( esti nasol"; break;;
        *) ;;
    esac
Terminat
drapel tm
Ascunde alte erori similar cu `|| true`, încercați să îl rulați cu `
Puncte:0
drapel us

Folosind răspunsul @choroba, mi-am schimbat cazul comutatorului în:

#!/bin/bash

set -e

prompt="bla? [D/n] "

în timp ce adevărat; do
    citește -p „$prompt” -n 1 -s -t 3 răspuns || (( $? > 128 ))
    caz $reply in
        ""|Y|y) ecou "bla!!!"; pauză;;
        N|n) echo "nu bla :( esti nasol"; break;;
        *) ;;
    esac
Terminat

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.