อ่านประวัติ


11

ฉันจะสร้างreadประวัติการสนับสนุนคำสั่งbuiltin ได้อย่างไรโดยการกดปุ่มขึ้น / ลงเพื่อวนรอบพวกเขา

ฉันพยายามจับเมื่อคุณกดปุ่ม up แต่ดูเหมือนจะไม่ทำงานกับread:

read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump

การกดปุ่มลูกศรดูเหมือนว่าจะใช้งานได้และฉันสามารถตรวจจับได้โดยใช้สิ่งนี้ แต่ถ้าฉันกดaaมันจะล้มเหลวเนื่องจากมันจะอ่านตัวอักษรแรกของตัวระบุของลูกศรขึ้นเท่านั้นในขณะที่ตัวที่สามจำเป็นต้องแยกลูกศรที่แตกต่างกัน กุญแจ

คำตอบ:


9

คุณสามารถใช้rlwrapสิ่งนี้หากคุณไม่สนใจการติดตั้งซอฟต์แวร์

คุณอาจต้องการเก็บไฟล์ประวัติแยกต่างหากซึ่งเก็บรักษาประวัติเฉพาะสำหรับพรอมต์เฉพาะในสคริปต์ของคุณ (เช่นหลีกเลี่ยงการผสมกับประวัติคำสั่งเชลล์ของผู้ใช้)

นี่คือตัวอย่างที่อาจเหมาะกับคุณ:

#!/bin/sh
# Save in rlwrap_example.sh

HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"

$ ./rlwrap_example.sh
hello
User said hello

ในสคริปต์ข้างต้นผู้ใช้สามารถใช้ทุกReadLine GNUฟังก์ชั่นที่มีประวัติเสิร์ฟ - และเก็บไว้ใน ~/.myscript_history- ปรับแต่งตามต้องการ

หรือคุณสามารถใช้ bash's read -eซึ่งเปิดใช้งาน readline สำหรับreadการเรียกใช้ แต่คุณอาจพบว่าฟังก์ชันการทำงานของประวัตินั้น จำกัด เกินไป (เช่นเกือบจะไม่มีเลย)


10

หากต้องการคัดลอกคำตอบที่ยอดเยี่ยมของ Mike Stroyan จากโพสต์จดหมายข่าวเก่า :

คุณสามารถใช้ "history -r" เพื่ออ่านไฟล์ลงในประวัติของเชลล์และ "history -s" เพื่อเพิ่มแต่ละบรรทัดที่คุณอ่านลงในประวัติ จากนั้นใช้ history -w เพื่อบันทึกประวัติกลับไปที่ไฟล์ นี่คือตัวอย่างที่มีการแก้ไข readline สไตล์ vi

#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
    echo "Type something"
    read -e CMD
    history -s "$CMD"
    echo "You typed $CMD"
    case "$CMD" in
        stop)
            break
            ;;
        history)
            history
            ;;
    esac
done
history -w script_history
echo stopping

ฉันชอบวิธีนี้ดีกว่าrlwrap(อย่างน้อยในเครื่องของฉัน) rlwrapไม่สามารถจัดการ CTRL-C ได้อย่างสง่างามเช่นลองใช้งานUSERINPUT=$(rlwrap -o cat)และกด CTRL-C และดูว่าเทอร์มินัลของคุณทำงานอย่างไรในภายหลัง (เรียกใช้resetคำสั่งเพื่อกลับสู่สถานะสติอีกครั้ง) .
zpon

มันใช้งานได้ดีจริง ๆ ถ้าคุณไม่ต้องการติดตั้ง libs เพิ่มเติมและคุณมีความสุขที่ใช้ไฟล์แยกต่างหากเพื่อจัดการอินพุต
ลุค Exton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.