Điểm:0

Làm cách nào để đọc khi hết thời gian chờ mà không khiến bash coi đó là lỗi?

lá cờ us

Tôi có tập lệnh read_user_input.sh:

#!/bin/bash

# bộ -e

dấu nhắc="bla? [Y/n] "

trong khi đúng; làm
    đọc -p "$prompt" -n 1 -s -t 3 trả lời
    trường hợp $ trả lời trong
        ""|Y|y) tiếng vang "bla!!!"; nghỉ;;
        N|n) echo "no bla:( đồ dở hơi"; break;;
        *);;
    thoát hiểm
xong

Hoạt động như tôi mong đợi - tức là

  • Người dùng nhập "Y" -> bla
  • Người dùng nhập "y" -> bla
  • Người dùng nhấn Enter -> bla
  • Hết giờ -> bla bla

Tuy nhiên, khi thêm đặt -e - quá trình đọc kết thúc với lỗi > 128.

Từ đọc --help:

Trạng thái thoát:

Mã trả về bằng 0, trừ khi gặp phải phần cuối của tệp, hết thời gian đọc (trong trường hợp đó lớn hơn 128), sẽ xảy ra lỗi gán biến, hoặc một bộ mô tả tệp không hợp lệ được cung cấp làm đối số cho -u.

Điều gì sẽ là cách tốt nhất để khắc phục điều này?

  1. thêm || thật có vẻ không đúng, vì nó sẽ che giấu bất kỳ lỗi thực sự nào.
  2. Tôi cũng không muốn xóa đặt -e.
  3. Một điều khác tôi nghĩ đến là xử lý nó trong bẩy nhưng điều đó có vẻ như là một quá mức cần thiết
Điểm:2
lá cờ tm

Thay vì thêm || thật, đặt $trả lời đến y nếu có thời gian chờ:

    đọc -p "$prompt" -n 1 -s -t 3 trả lời || {
        sai = $?
        nếu (( $err > 128 )) ; sau đó
            trả lời = y
        khác
            thoát $err
        fi
    }
CIsForCookies avatar
lá cờ us
Tôi đã sử dụng nó hơi khác một chút để nó phù hợp với vỏ công tắc của tôi
lá cờ tm
Tôi đã cập nhật câu trả lời để mã thoát tương ứng với mã ban đầu, không phải mã đến từ `$? > 128`.
CIsForCookies avatar
lá cờ us
Tôi nghĩ rằng câu trả lời của tôi cho kết quả tương tự
lá cờ tm
Hãy thử thay đổi `read` thành `XXXread` và xem bạn nhận được mã thoát nào từ cả hai phiên bản.
CIsForCookies avatar
lá cờ us
phiên bản của tôi tồn tại, đó là lý tưởng
lá cờ tm
Có, nhưng với mã 1 thay vì 127.
Điểm:0
lá cờ us

Sử dụng câu trả lời @choroba, tôi đã thay đổi trường hợp chuyển đổi của mình thành:

#!/bin/bash

đặt -e

dấu nhắc="bla? [Y/n] "

trong khi đúng; làm
    đọc -p "$prompt" -n 1 -s -t 3 trả lời || (( $? > 128 ))
    trường hợp $ trả lời trong
        ""|Y|y) tiếng vang "bla!!!"; nghỉ;;
        N|n) echo "no bla:( đồ dở hơi"; break;;
        *);;
    thoát hiểm
xong
Điểm:0
lá cờ cn

Đây là một bản hack được sử dụng thay thế lệnh để tạo ra một lớp con trong đó -e không được kích hoạt.

#!/bin/bash

đặt -e

dấu nhắc="bla? [Y/n] "

trong khi đúng; làm
    case $(read -p "$prompt" -n 1 -s -t 3 reply; echo $reply) trong
        ""|Y|y) tiếng vang "bla!!!"; nghỉ;;
        N|n) echo "no bla:( đồ dở hơi"; break;;
        *);;
    thoát hiểm
xong
lá cờ tm
Nó ẩn các lỗi khác tương tự như `|| true`, hãy thử chạy nó với `

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.