टेक्स्ट को बैश कमांड लाइन बफर में रखें


9

मैं प्रोग्राम की बशर्ते कि कमांड लाइन बफर में पाठ का एक निश्चित टुकड़ा डाल दिया है, संपादित करने के लिए पढ़ा और एक कमांड के रूप में इस्तेमाल किया जाना चाहते हैं।

जो मैं आगे देख रहा हूं वह कुछ ऐसा ही है read -iलेकिन आज्ञाओं के लिए है।

-i text यदि लाइन को पढ़ने के लिए रीडलाइन का उपयोग किया जा रहा है, तो संपादन शुरू होने से पहले टेक्स्ट को संपादन बफर में रखा जाता है।

संपादित करें : प्रोग्रामेटिक रूप से मेरा मतलब है कि इसे स्क्रिप्ट में लिखना चाहते हैं , स्क्रिप्ट लॉन्च करें और कमांड बफ़र तैयार करें या कमांड हिस्ट्री को संशोधित करें (जैसा कि कुछ प्रश्न सुझाए गए हैं)।


IIRC screenआपके लिए ऐसा कर सकता है।
स्ट्रगलर

जवाबों:


6

मुझे fzf उदाहरण पृष्ठ पर ऐसा करने का एक हैडी तरीका मिला । यह बाश 4.3 और perl 5.18 के साथ काम करता है:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

यह कमांड को स्टडआउट करने के लिए प्रिंट करता है, लेकिन इसे कमांड बफर में भी कॉपी करता है। यदि आप सीधे कमांड निष्पादित करना चाहते हैं तो लिंक किए गए पृष्ठ पर एक उदाहरण भी है।


यह उत्तर ओपी द्वारा पूछा गया सबसे निकटतम है।
reza.safiyat

इस उत्तर में थोड़ा अलग वाक्यविन्यास , &TIOCSTIकी तुलना में थोड़ा अच्छा है 0x5412। वर्थ नोटिंग यह कुछ प्लेटफार्मों की तरह लगता है (जैसे ओपनबीएसडी ) हालांकि TIOCSTI को अक्षम करें। मुझे लगता है कि इसका मतलब है कि यह दृष्टिकोण और zsh दोनों print -zकाम नहीं करेंगे।
dimo414

4

यदि यह एक फ़ंक्शन के लिए है जिसे आप रीडलाइन बाइंडिंग में उपयोग करने जा रहे हैं bind -xतो आप संशोधित कर सकते हैं READLINE_LINE। ( उदाहरण )

बाइंडिंग बाइंडिंग के बाहर, आप इतिहास के साथ एक नकली कमांड पुश कर सकते हैं history -s


समस्या यह है कि अगर मैं history -s 'foo'एक स्क्रिप्ट में करता हूं , तो लॉन्च किए गए शेल का इतिहास बिल्कुल भी संशोधित नहीं है
जियोले

@ सर्जेल आपको इसे शेल के भीतर से लॉन्च करना होगा (जैसे एक स्क्रिप्ट जिसे आप लोड करते हैं source)। आप एक अलग प्रक्रिया से कुछ भी नहीं कर सकते।
गिल्स एसओ- बुराई को रोकना '

2

गिल्स का जवाब सही है, लेकिन पूरी तरह से संतोषजनक नहीं। जैसा कि मैंने इस प्रश्न को पढ़ा है, ओपी अगली इनपुट लाइन "प्रेज़ेड" करना चाहता है। मेरे मामले में मैं अपने PROMPT_COMMAND फ़ंक्शन में टर्मिनल की वर्तमान स्थिति को पढ़ना चाहता था। यह काम करता है लेकिन प्राथमिक शेल के समान रीड बफर का उपयोग करता है, और इसलिए किसी भी उपयोगकर्ता इनपुट को इस तथ्य से खारिज कर दिया जाता है कि मैंने फ़ंक्शन में 'रीड' बिलिन कॉल किया था। इसलिए मैं उपयोगकर्ता इनपुट को अलग से पढ़ना चाहता था, क्या मेरा टर्मिनल पढ़ा है, और फिर इनपुट इनपुट में रीड इनपुट वापस डाल दिया, जो कि मूल प्रश्न है। ध्यान दें कि यह वास्तव में एक ही प्रक्रिया के भीतर है, इसलिए सैद्धांतिक रूप से यह संभव होना चाहिए।

जहाँ तक मैं देख सकता हूँ (मेरे bash 4.2 पर) प्रोग्राम को इनपुट स्टैक से कुछ पुश करने के लिए कोई फंक्शन नहीं है। Zsh में 'Print -z' का उपयोग किया जा रहा है।

तो इसका उत्तर है: यह संभव नहीं है कि आप इस के लिए zsh का उपयोग करें।


0

history -s 'foo'कोशिश करने के लिए एक विकल्प के रूप में :

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.