बैश स्क्रिप्ट में ENTER keypress का अनुकरण


97

मैंने एक बहुत ही सरल बैश स्क्रिप्ट बनाई है जो कुछ कमांड चलाती है। इनमें से एक कमांड को रनटाइम के दौरान उपयोगकर्ता इनपुट की आवश्यकता होती है। यानी यह उपयोगकर्ता से पूछता है "क्या आप ब्ला ब्ला ब्ला करना चाहते हैं?", मैं बस इस पर एक प्रवेश कुंजी भेजना चाहता हूं ताकि स्क्रिप्ट पूरी तरह से स्वचालित हो जाए।

मुझे रनटाइम के दौरान इनपुट या किसी भी चीज़ के लिए इंतजार नहीं करना पड़ेगा, इसके लिए बस कीप को भेजना होगा और इनपुट बफर बाकी को संभाल लेगा।


1
यदि आप जिस उपकरण को स्वचालित करने का प्रयास कर रहे हैं apt-get, वह उचित समाधान है कि आप अपने पसंदीदा मूल्यों के साथ डिबेंक डेटाबेस को छांट लें; तब यह आपसे नहीं पूछेगा।
त्रिकाल

आप इको के बजाय
प्रिंटफ का

जवाबों:


133
echo -ne '\n' | <yourfinecommandhere>

या निहित प्रभाव का लाभ उठाते हुए जो प्रतिध्वनित होता है (धन्यवाद मार्सिन)

echo | <yourfinecommandhere>

अब हम बस --skविकल्प का उपयोग कर सकते हैं :

--sk, --skip-keypressप्रत्येक परीक्षण के बाद एक कुंजीपट की प्रतीक्षा न करें

अर्थात sudo rkhunter --sk --checkall


1
यदि आप इस आउटपुट को फीड करते हैं तो आपको हेक्स xxdमिलता है 5c6e, जो कि शाब्दिक है \n। यदि आप ऐसा करते हैं तो echo | xxd आप वास्तव में हेक्स के साथ अंत करते हैं 0a। इसलिए मुझे लगता है कि जो भी आपके कार्यक्रम की जरूरत है उसका उपयोग करें।
मार्सिन

3
@ मारकिन, मुझे आश्चर्य है, मुझे वह मिलता है 0a0aजो अभी भी इरादा नहीं है, एक -nसप्रेस जो निहित न्यूलाइन को जोड़ता है । लेकिन आपकी बात सही है, एक सादे echo | ...यहाँ ठीक काम करता है। मेरे उत्तर को अपडेट करेंगे।
तिलमन वोगल

हे, यह मेरे लिए काफी सही नहीं लग रहा था, इसलिए मुझे इसे xxd के माध्यम से खिलाना पड़ा। यह अब तक का सबसे सरल लेकिन कुशल तरीका है, जो वास्तव में आउटपुट को कमांड करता है। गपशप बेवकूफ बेवकूफ चालें प्यार करता हूँ।
मार्सिन

@Marcin, फिर भी, आपको क्यों मिलता है 5c6e? क्या आपने उस विकल्प का उपचार किया है -eया echoनहीं किया है?
तिलमन वोगल

मैं मिलता है: echo -ne "\n" | xxd 0000000: 0a और echo -n "\n" | xxd 0000000: 5c6e और echo "\n" | xxd 0000000: 5c6e 0a मैं सिंगल और डबल उद्धरण के बीच कोई अंतर नहीं देखा है। मेरा शेल सिर्फ एक नियमित बैश है, क्या ऐसी सेटिंग्स है जो इस तरह की बुनियादी कार्यक्षमता के व्यवहार को विनियमित करेगी?
मार्सिन

43

आपको yesकमांड उपयोगी मिल सकती है।

देख man yes


54
yesमुझे यह उपयोगी लगता है।
23

2
यह Enter कुंजी के बजाय "y" को बार-बार दबाने का अनुकरण करता है। हालांकि यह शायद वही है जो आप हां / नहीं में सवाल पूछना चाहते हैं, यह किसी भी चीज के लिए काम नहीं करेगा जो "y" की उम्मीद नहीं करता है।
बुरहान अली

5
@BurhanAli: आप yesआउटपुट के रूप में जो भेजता है उसे बदल सकते हैं । मैन पेज पढ़ें।
सिराइड

1
क्या मैं एक स्क्रिप्ट भेज सकता हूं जो डिफ़ॉल्ट मानों की अपेक्षा करता है एक स्क्रिप्ट के लिए [मान] {दर्ज}
AK_

यह केवल यम जैसी चीजों के लिए काम करता है। जहां उस स्ट्रिंग की उम्मीद है।
einarc


22

यहाँ नमूना उपयोग का उपयोग किया गया है expect:

#!/usr/bin/expect
set timeout 360
spawn my_command # Replace with your command.
expect "Do you want to continue?" { send "\r" }

जाँच करें: man expectआगे की जानकारी के लिए।


विशेष रूप से उपयोगी अगर कई दर्ज करें keypresses भेजने की जरूरत है
एंडी

यह सबसे अच्छा तरीका है, विशेष रूप से उन चीज़ों के लिए, जो अलग-अलग स्टडआउट और स्टिंग स्ट्रिंग्स भेजे जाते हैं।
einarc

यह भी याद रखें कि यदि आपके पास कोई तर्क है तो my_command arg दर्ज करें।
einarc

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