बैश में नकली कीस्ट्रोक्स भेजना


19

मैं हाल ही में एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जिसका उपयोग मेरे c ++ प्रोग्राम को bash में स्वचालित करने के लिए किया जा सकता है । यदि आप AutoIt जानते हैं, तो मैं आपको बस एक उदाहरण दिखा सकता हूं कि मैं क्या करने की कोशिश कर रहा हूं:

send("1{enter}")

या

send("!a")

ठीक है जो लोग AutoIt नहीं बोलते हैं:

पहला उदाहरण एक "सीआर" एक सिम्युलेटेड "1" भेजता है जिसके बाद एक एंटर (CR) होता है।

दूसरा उदाहरण alt-a भेजता है

मैं विशेष रूप से इसे कोसने में कोशिश कर रहा हूँ । कोई अन्य स्क्रिप्टिंग भाषा नहीं करेगी

इसके अलावा, मैं एक चम्मच खाना पसंद नहीं करूंगा। कृपया इसे लिखने का तरीका बताएँ । मेरे लिए कोई स्क्रिप्ट लिखने की अनुमति नहीं है।


1
क्या आप एक कमांड-लाइन, ncurses या चित्रमय कार्यक्रम को स्वचालित कर रहे हैं?
user1686

1
मैं अभी के लिए एक कमांड लाइन को स्वचालित कर रहा हूं। इसे सिनेमा के इनपुट (कंसोल इनपुट्स) में स्वचालित रूप से फीड करना माना जाता है
इशान

जवाबों:


16

प्रोग्राम के स्टड में टेक्स्ट फीड करने के लिए, पाइप और / या पुनर्निर्देशन का उपयोग करें :

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

इंटरैक्टिव CLI कार्यक्रम (के मामले में नहीं पूरे टर्मिनल वाले), यह नामित पाइपों या उपयोग करना संभव है coprocesses गरीब आदमी का एक प्रकार के रूप expect(जो आप Tcl होने के कारण की संभावना से इनकार):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(आउटपुट पाइप से पढ़ते समय सावधान रहें; जैसे head -1 <outकि सिर्फ एक पंक्ति नहीं पढ़ेंगे - यह एक पूर्ण 4k ब्लॉक को बफ़र करेगा, एक लाइन प्रिंट करेगा, बाकी को छोड़ देगा।)


दोनों के उत्तर समान रूप से अच्छे हैं। लेकिन, यह वही है जो मुझे अधिक तलाश है।
ईशान

सीएलआई कार्यक्रम / पूर्ण टर्मिनल का क्या मतलब है?
क्रिस स्ट्राइकसिनस्की

CLI का अर्थ कमांड लाइन इंटरफेस है। एक CLI प्रोग्राम एक साधारण प्रोग्राम है जो कमांड लाइन पर चलता है और आम तौर पर स्टडिन और स्टडआउट का उपयोग करता है क्योंकि यह कुछ कार्य करता है और फिर निष्पादन को पूरा करता है और कमांड लाइन प्रॉम्प्ट पर वापस लौटता है। grepऔर curlइसके अच्छे उदाहरण हैं। एक पूर्ण टर्मिनल प्रोग्राम एक ऐसी चीज है जो संपूर्ण विंडो, जैसे vimऔर का नियंत्रण लेता है screen
ट्रेविन एवरी

16

आप xdotool की तलाश कर रहे हैं ।

आपके उदाहरण आदेशों के xdotool के बराबर हैं:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

यह अच्छा है। लेकिन मैं कुछ शुद्ध बैश कोड के बारे में सोच रहा था
इशान

9
@ इशान: शुद्ध बैश कोड के साथ ऐसी चीजें करना व्यावहारिक रूप से असंभव है । बैश सीधे X11 का उपयोग नहीं कर सकता है, और यह किसी भी मौजूदा X11 लाइब्रेरी का उपयोग नहीं कर सकता है। आपको सीधे X11 सॉकेट से कनेक्ट करना होगा (bash केवल TCP करता है, यूनिक्स सॉकेट्स नहीं), हाथ से X11 प्रोटोकॉल को पार्स करें (bash में बाइनरी डेटा को पार्स करना विफल हो जाता है) और उपयुक्त प्रतिक्रियाओं को क्राफ्ट करें। बैश एक शेल है, यह बाहरी उपकरणों को चैंज करके काम करने के लिए बनाया गया है।
user1686
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.