đọc với lịch sử


11

Làm cách nào tôi có thể tạo readlịch sử hỗ trợ lệnh dựng sẵn , bằng cách nhấn phím lên / xuống để xoay vòng qua chúng?

Tôi đã thử bắt khi bạn nhấn phím lên, tuy nhiên nó dường như không hoạt động với read:

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

Nhấn các phím mũi tên dường như hoạt động và tôi có thể phát hiện nó bằng cách này, tuy nhiên nếu tôi nhấn aa, nó sẽ thất bại vì nó sẽ chỉ đọc ký tự đầu tiên của mã định danh của mũi tên lên, trong khi thứ ba là cần thiết để phân biệt mũi tên khác nhau chìa khóa.

Câu trả lời:


8

Bạn có thể sử dụng rlwrapcho việc này, nếu bạn không nhớ cài đặt phần mềm.

Bạn có thể muốn giữ một tệp lịch sử riêng biệt chỉ duy trì lịch sử cho lời nhắc cụ thể trong tập lệnh của bạn (ví dụ: tránh trộn lẫn với lịch sử lệnh shell của người dùng).

Đây là một ví dụ có thể phù hợp với bạn:

#!/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

Trong đoạn script trên, người dùng có thể sử dụng tất cả chức năng đọc dòng GNU , với lịch sử được phân phối từ - và được lưu trữ trong -  ~/.myscript_history. Tinh chỉnh khi cần thiết.

Ngoài ra, bạn có thể sử dụng bash's read -e, cho phép đọc đường dẫn cho các readyêu cầu, nhưng bạn có thể sẽ thấy chức năng lịch sử của nó quá hạn chế (ví dụ: gần như không có).


10

Để sao chép câu trả lời tuyệt vời của Mike Stroyan từ bài đăng danh sách gửi thư cũ này :

Bạn có thể sử dụng "history -r" để đọc tệp vào lịch sử của shell và "history -s" để thêm từng dòng mà bạn đọc vào lịch sử. Sau đó sử dụng history -w để lưu lại lịch sử vào tập tin. Dưới đây là một ví dụ với chỉnh sửa kiểu đọc 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

Tôi thích giải pháp này tốt hơn rlwrapvì (ít nhất là trên máy của tôi) rlwrapkhông thể xử lý CTRL-C một cách duyên dáng, ví dụ: thử chạy USERINPUT=$(rlwrap -o cat)và nhấn CTRL-C và xem thiết bị đầu cuối của bạn hoạt động như thế nào sau đó (chạy lại resetlệnh để trở lại trạng thái lành mạnh) .
zpon

Điều này hoạt động thực sự độc đáo nếu bạn không muốn cài đặt thêm lib và bạn hài lòng khi sử dụng một tệp riêng để quản lý đầu vào.
Luke Exton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.