tarihle okumak


11

Yerleşik readkomut destek geçmişini, aralarında dolaşmak için yukarı / aşağı tuşuna basarak nasıl yapabilirim ?

Yukarı tuşuna bastığınızda yakalamayı denedim, ancak bununla çalışmak görünmüyor read:

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

Ok tuşlarına basmak işe yarıyor gibi görünüyor ve bunu kullanarak tespit edebilirim, ancak aa↑basarsam başarısız olur, çünkü yukarı ok tanımlayıcısının sadece ilk karakterini okuyacaktır, üçüncüsü ise farklı oku ayırt etmek gerekir anahtarlar.

Yanıtlar:


9

rlwrapYazılım yüklemeyi düşünmüyorsanız bunun için kullanabilirsiniz .

Muhtemelen betiğinizdeki belirli bilgi istemi için geçmişi koruyan ayrı bir geçmiş dosyası tutmak isteyeceksiniz (yani, kullanıcının kabuk komut geçmişi ile karıştırmaktan kaçının).

İşte size uygun bir örnek:

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

Yukarıdaki komut dosyasında, kullanıcı tüm GNU okuma çizgisi işlevlerini kullanabilir ve geçmişi - içinde depolanmış ve - içinde saklanır  ~/.myscript_history. Gerektiği gibi değiştirin.

Alternatif olarak, çağrılar read -eiçin readline'ı etkinleştiren bash'ı kullanabilirsiniz read, ancak muhtemelen geçmiş işlevselliğini çok sınırlı bulacaksınız (yani neredeyse yok).


10

Mike Stroyan'ın büyük cevabını bu eski posta listesi postasından kopyalamak için :

Kabuğun geçmişine bir dosya okumak için "history -r" ve geçmişe okuduğunuz her satırı eklemek için "history -s" kullanabilirsiniz. Sonra geçmişi dosyaya kaydetmek için -w geçmişini kullanın. Vi tarzı readline düzenleme ile bir örnek.

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

Bu çözümü rlwrap(en azından makinemde) rlwrapCTRL-C'yi zarif bir şekilde işleyemediğinden daha iyi seviyorum , örneğin USERINPUT=$(rlwrap -o cat)CTRL-C'yi çalıştırmayı ve basmayı deneyin ve terminalinizin daha sonra nasıl davrandığını görün ( resetbir aklı başında duruma geri dönmek için komutu çalıştırın ) .
— zpon

Ek libs yüklemek istemiyorsanız ve girişi yönetmek için ayrı bir dosya kullanmaktan memnunsanız, bu gerçekten güzel çalışır.
— Luke Exton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.