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 aabasarsam 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.