Score:0

จะอ่านด้วยการหมดเวลาโดยไม่ทำให้ bash ถือว่าเป็นข้อผิดพลาดได้อย่างไร

ธง us

ฉันมีสคริปต์ read_user_input.sh:

#!/bin/bash

# ชุด -e

พรอมต์ = "bla? [Y/n] "

ในขณะที่จริง; ทำ
    อ่าน -p "$ พร้อมท์" -n 1 -s -t 3 ตอบกลับ
    กรณี $reply in
        ""|Y|y) echo "บลา!!!"; หยุดพัก;;
        N|n) echo "no bla :( you suck"; break;;
        *) ;;
    เอสแซค
เสร็จแล้ว

ทำงานตามที่ฉันคาดไว้ - เช่น

  • อินพุตของผู้ใช้ "Y" -> bla
  • อินพุตของผู้ใช้ "y" -> bla
  • ผู้ใช้กด Enter -> bla
  • หมดเวลา -> บลา

แต่เมื่อเพิ่ม ตั้ง -e - การอ่านจบลงด้วยข้อผิดพลาด > 128

จาก อ่าน -- ช่วย:

สถานะทางออก:

โค้ดส่งคืนเป็นศูนย์ เว้นแต่จะพบการสิ้นสุดของไฟล์ การอ่านหมดเวลา (ซึ่งในกรณีนี้มีค่ามากกว่า 128) จะเกิดข้อผิดพลาดในการกำหนดตัวแปร หรือตัวอธิบายไฟล์ที่ไม่ถูกต้องถูกระบุเป็นอาร์กิวเมนต์ถึง -u

วิธีที่ดีที่สุดในการเอาชนะสิ่งนี้คืออะไร

  1. การเพิ่ม || จริง ดูเหมือนจะไม่ถูกต้องเนื่องจากจะซ่อนข้อผิดพลาดจริง ๆ
  2. ฉันก็ไม่ต้องการลบไฟล์ ตั้ง -e.
  3. อีกสิ่งหนึ่งที่ฉันคิดเกี่ยวกับการจัดการมันใน กับดัก แต่นั่นดูเหมือนจะเกินความจำเป็น
Score:2
ธง tm

แทนที่จะเพิ่ม || จริง, ตั้ง $ตอบกลับ ถึง หากมีการหมดเวลา:

    อ่าน -p "$ พร้อมท์" -n 1 -s -t 3 ตอบกลับ || {
        ผิดพลาด=$?
        ถ้า (( $err > 128 )) ; แล้ว
            ตอบ = y
        อื่น
            ออกจาก $ผิดพลาด
        ไฟ
    }
CIsForCookies avatar
us flag
ฉันใช้มันแตกต่างกันเล็กน้อยเพื่อให้เข้ากับเคสสวิตช์ของฉัน
tm flag
ฉันอัปเดตคำตอบเพื่อให้รหัสออกตรงกับรหัสเดิม ไม่ใช่รหัสที่มาจาก `$? >128`.
CIsForCookies avatar
us flag
ฉันคิดว่าคำตอบของฉันให้ผลลัพธ์เดียวกัน
tm flag
ลองเปลี่ยน "read" เป็น "XXXread" แล้วดูว่าคุณได้รับรหัสทางออกใดจากทั้งสองเวอร์ชัน
CIsForCookies avatar
us flag
รุ่นของฉันมีอยู่ซึ่งเหมาะอย่างยิ่ง
tm flag
ใช่ แต่ใช้รหัส 1 แทน 127
Score:0
ธง us

เมื่อใช้คำตอบ @choroba ฉันเปลี่ยนกรณีสวิตช์เป็น:

#!/bin/bash

ตั้ง -e

พรอมต์ = "bla? [Y/n] "

ในขณะที่จริง; ทำ
    อ่าน -p "$ พร้อมท์" -n 1 -s -t 3 ตอบกลับ || (( $? > 128 ))
    กรณี $reply in
        ""|Y|y) echo "บลา!!!"; หยุดพัก;;
        N|n) echo "no bla :( you suck"; break;;
        *) ;;
    เอสแซค
เสร็จแล้ว
Score:0
ธง cn

นี่คือแฮ็คที่ใช้การแทนที่คำสั่งซึ่งแยกเชลล์ย่อยโดยที่ -e ไม่ได้เปิดใช้งาน

#!/bin/bash

ตั้ง -e

พรอมต์ = "bla? [Y/n] "

ในขณะที่จริง; ทำ
    กรณี $(read -p "$prompt" -n 1 -s -t 3 reply; echo $reply) ใน
        ""|Y|y) echo "บลา!!!"; หยุดพัก;;
        N|n) echo "no bla :( you suck"; break;;
        *) ;;
    เอสแซค
เสร็จแล้ว
tm flag
มันซ่อนข้อผิดพลาดอื่นๆ ที่คล้ายกับ `|| จริง` ลองรันด้วย `

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา