इतिहास के साथ पढ़ें


11

मैं readउनके द्वारा चक्र बनाने के लिए ऊपर / नीचे कुंजी दबाकर बिलिन कमांड समर्थन इतिहास कैसे बना सकता हूं ?

जब आप कुंजी दबाते हैं तो मैंने पकड़ने की कोशिश की है, हालांकि इसके साथ काम करना संभव नहीं लगता 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

उपर्युक्त स्क्रिप्ट में, उपयोगकर्ता सभी GNU रीडलाइन कार्यक्षमता का उपयोग कर सकता है , जिसमें से परोसा गया इतिहास - और में संग्रहीत है  ~/.myscript_history। आवश्यकतानुसार मोड़।

वैकल्पिक रूप से, आप बैश का उपयोग कर सकते हैं read -e, जो readइनवोकेशन के लिए रीडलाइन को सक्षम करता है , लेकिन आपको संभवतः इसकी इतिहास कार्यक्षमता सीमित (यानी लगभग कोई नहीं) मिलेगी।


10

इस पुरानी मेलिंग सूची पोस्ट से माइक स्ट्रॉयन के शानदार उत्तर की प्रतिलिपि बनाने के लिए :

आप शेल के इतिहास में फ़ाइल पढ़ने के लिए "इतिहास -r" का उपयोग कर सकते हैं और "इतिहास -s" प्रत्येक पंक्ति को जोड़ने के लिए जो आप इतिहास में पढ़ते हैं। फिर इतिहास -W का उपयोग इतिहास को फाइल में वापस लाने के लिए करें। यहां 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कि (कम से कम मेरी मशीन पर) rlwrapCTRL-C को इनायत से संभाल नहीं पा रहा है, उदाहरण के लिए CTRL-C को चलाने USERINPUT=$(rlwrap -o cat)और दबाने की कोशिश करें और देखें कि आपका टर्मिनल बाद में कैसे व्यवहार करता है ( resetकमांड को फिर से एक सायन अवस्था में वापस लाने के लिए) ।
zpon

यह वास्तव में अच्छी तरह से काम करता है अगर आप अतिरिक्त कामेच्छा स्थापित नहीं करना चाहते हैं और आप इनपुट का प्रबंधन करने के लिए एक अलग फ़ाइल का उपयोग करके खुश हैं।
ल्यूक एक्सटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.