स्वचालित रूप से कमांड लाइन में इनपुट दर्ज करें


141

मैं एक स्क्रिप्ट चला रहा हूं कि यह प्रत्येक ऑपरेशन पर 'y' दर्ज करने का अनुरोध करता है, मैं एक समाधान की तलाश कर रहा हूं जैसे $ ./script < echo 'yyyyyyyyyyyyyy'कि एक समय में मेरे सभी इनपुट पास करना।


कभी-कभी -fविकल्प कुछ आदेशों के साथ अच्छी तरह से काम करता है।
इमिलिंद

जवाबों:


257

उस मामले के लिए विशेष रूप से बनाई गई एक कमांड है: yes

$ yes | ./script

यह क्या करता है yesके इनपुट से आउटपुट कनेक्ट होता है ./script। तो जब ./scriptउपयोगकर्ता इनपुट के लिए पूछता है तो इसके बदले आउटपुट मिलेगा yes। का उत्पादन एक नई yesधारा के yबाद की एक अंतहीन धारा है । तो मूल रूप से के रूप में अगर उपयोगकर्ता yके हर सवाल के लिए प्रवेश कर रहा है ./script

यदि आप nहां ( y) के बजाय नो ( ) कहना चाहते हैं तो आप इसे इस तरह कर सकते हैं:

$ yes n | ./script

ध्यान दें कि कुछ उपकरणों के पास हमेशा yesउत्तर के रूप में मानने का विकल्प होता है । उदाहरण के लिए यहाँ देखें: 'apt-get उन्नयन' में हाँ / नहीं प्रॉम्प्ट को बायपास करें


इनपुट दर्ज करने के अन्य तरीके:

यदि आप जानते हैं कि yआपकी स्क्रिप्ट कितनी उम्मीद कर रही है तो आप इसे इस तरह से कर सकते हैं:

$ printf 'y\ny\ny\n' | ./script

Newlines ( \n) प्रविष्टियाँ हैं।

आपके printfबजाय उपयोग करने yesसे इनपुट का अधिक महीन दानेदार नियंत्रण होता है:

$ printf 'yes\nno\nmaybe\n' | ./script

ध्यान दें कि कुछ दुर्लभ मामलों में कमांड को चरित्र के बाद उपयोगकर्ता को एंटर प्रेस करने की आवश्यकता नहीं होती है। उस मामले में नई रूपरेखाएँ छोड़ें:

$ printf 'yyy' | ./script

पूर्णता के लिए आप यहां एक दस्तावेज़ का उपयोग कर सकते हैं :

$ ./script << EOF
y
y
y
EOF

या यदि आपका शेल इसे यहां स्ट्रिंग का समर्थन करता है :

$ ./script <<< "y
y
y
"

या आप प्रति पंक्ति एक इनपुट के साथ एक फ़ाइल बना सकते हैं:

$ ./script < inputfile

यदि कमांड पर्याप्त रूप से जटिल है और ऊपर दिए गए तरीके अब पर्याप्त नहीं हैं तो आप उम्मीद का उपयोग कर सकते हैं ।

यहाँ एक सुपर सरल अपेक्षा स्क्रिप्ट का एक उदाहरण दिया गया है:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

तकनीकी नाइटिक:

आपके प्रश्न में दिया गया काल्पनिक कमांड आह्वान काम नहीं करता है:

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

ऐसा इसलिए है क्योंकि शेल व्याकरण कमांड लाइन में कहीं भी पुनर्निर्देशित ऑपरेटर की अनुमति देता है। जहां तक ​​शेल का संबंध है, आपकी काल्पनिक कमांड लाइन इस लाइन के समान है:

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

इसका मतलब है कि ./scriptतर्क के साथ बुलाया जाएगा 'yyyyyyyyyyyyyy'और स्टडिन को नाम की फ़ाइल से इनपुट मिलेगा echo। और बैश शिकायत करता है क्योंकि फ़ाइल मौजूद नहीं है।


1
मुझे ए cannot enable tty mode on non tty input। क्या आप इसके लिए वर्कअराउंड जानते हैं?
बंपासिनी

जब मैं printfएक runफ़ाइल के साथ चाल की कोशिश करता हूं जिसे मुझे स्थापना प्रक्रिया को स्वचालित करने की आवश्यकता होती है, तो यह सब होता है मुझे एक त्रुटि संदेश मिल रहा है Warning: Tried to connect to session manager, None of the authentication protocols specified are supported, और स्क्रिप्ट एक नए टर्मिनल में खुलती है और मुझे अपने इनपुट को मैन्युअल रूप से सामान्य रूप से दर्ज करने के लिए कहती है। यह रास्ते में डेबियन पर हो रहा है। कोई सुझाव?
डेविड जुएल

अधिक जानकारी की आवश्यकता है। टिप्पणियों के लिए बहुत बड़ा है। कृपया सभी विवरणों के साथ एक नया प्रश्न पूछें। आप यहां एक लिंक डाल सकते हैं।
lesmana

सेंटोस पर 'वेजिटरी नष्ट' के साथ कुछ भी काम नहीं करता है
ड्रू

दुष्ट आसान! Google क्लाउड बीटा SQL डेटा आयात पर काम करता है! बहुत सराहना की!
G_Style

11

कमांड का उपयोग करें yes:

yes | script

मैन पेज से अंश:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

9

कुछ चीजें ( apt-getउदाहरण के लिए) मूक मोड में चलने के लिए विशेष झंडे को स्वीकार करती हैं (और चूक को स्वीकार करती हैं)। में apt-getके मामले में, तुम सिर्फ यह एक पारित -yझंडा। हालांकि यह पूरी तरह से आपकी स्क्रिप्ट पर निर्भर करता है।

यदि आपको अधिक जटिल चीजों की आवश्यकता है, तो आप अपनी स्क्रिप्ट को एक उम्मीद की स्क्रिप्ट में लपेट सकते हैं। उम्मीद है कि आप आउटपुट पढ़ सकते हैं और इनपुट भेज सकते हैं ताकि आप बहुत जटिल चीजें कर सकें जो अन्य स्क्रिप्टिंग की अनुमति नहीं देगा। इसके विकिपीडिया पृष्ठ से एक उदाहरण यहाँ दिया गया है :

# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof

यह इसे .shशेल स्क्रिप्ट के साथ उपयोग नहीं किया जा सकता है , है ना? या कोई रास्ता है?
शयन

7

शेल स्क्रिप्ट में आप स्पॉन के निम्नलिखित ट्रिक का उपयोग कर सकते हैं, उम्मीद और भेज सकते हैं

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

हालाँकि उपरोक्त श्रोणीओ में आपको वह वाक्यांश देना होगा जो आप प्राप्त करने की उम्मीद कर रहे हैं जब आप स्क्रिप्ट का निष्पादन करते हैं तो अधिक उदाहरणों के लिए निम्न लिंक पर जाएं

बैश के भीतर की उम्मीद


2

ठीक है, यह एक बहुत ही सुंदर समाधान नहीं हो सकता है, लेकिन यदि आप एक अलग फ़ाइल में अपने विकल्प लिखते हैं और फिर इसे स्क्रिप्ट के इनपुट के रूप में पास करते हैं, तो यह भी काम करेगा। इसलिए यदि आप अपने सभी विकल्पों के साथ एक नई फ़ाइल बनाते हैं (इस फ़ाइल को 'options.in' के रूप में कहते हैं), तो आप आसानी से अपनी स्क्रिप्ट चला सकते हैं ./script.sh < options.inऔर उपयुक्त के रूप में विभिन्न विकल्प फ़ाइलों को संपादित / बना सकते हैं।


मुझे options.inफ़ाइल कैसे लिखनी चाहिए ? क्या आप एक उदाहरण दे सकते हैं?
शयन

0

मैं डायलॉग के साथ एक बैश स्क्रिप्ट लिख रहा था और इसे अपने आप भी होने की जरूरत थी। मैंने ऐसा किया और यह एक आकर्षण की तरह काम करता है।

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

-1

आप catअपनी स्क्रिप्ट को bashइस तरह से अपनी स्क्रिप्ट के साथ जोड़कर, एक टेक्स्ट फ़ाइल से उपयोगकर्ता इनपुट की आपूर्ति कर सकते हैं :

cat input.txt | bash your_script.sh

बस अपने वांछित उपयोगकर्ता इनपुट को अपने इनपुट में रखें। टेक्स्ट फ़ाइल, जो भी उत्तर आप चाहते हैं - y, n, अंक, स्ट्रिंग्स, आदि।



@ मेरे लिए, आपके द्वारा बताए गए समाधान से काम नहीं चला है, इसलिए मुझे अपना खुद का आविष्कार करना होगा।
वेबकॉम

संभावना नहीं है। आप दोनों एक ही बात का वर्णन करते हैं।
मुरहू

फ़ाइल से आपूर्ति के उत्तर के बारे में @muru समान विचार (जो कई तरीकों से किया जा सकता है) एक ही बात नहीं है, और इसके अलावा यह काफी अलग तरीके से पूरा हुआ है। आपको इसे देखने में सक्षम होना चाहिए। यदि आप जो समाधान बताते हैं, वह मेरे लिए काम करेगा, तो मैंने आज अपना समय पहिया को सुदृढ़ करने में नहीं बिताया। आपके लिए जो भी काम हो, आप उसका उपयोग कर सकते हैं।
वेबकॉमर

@ मेरा मानना ​​है कि दोनों के बीच एक अंतर है, जिनमें से कुछ जवाबों में वर्णित हैं, यहां पूछो askubuntu.com/questions/172982/… । मेरे लिए, उदाहरण के लिए, मेरा कोड यदि आउटपुट को फ़ाइल में रीडायरेक्ट किया जाता है, तो बाएं से दाएं एक प्राकृतिक प्रवाह के रूप में अधिक स्पष्ट लगता है। सब के बाद, नीचे काम कर रहे अच्छी तरह से समाधान की तरह आप लोगों को अपने समाधान यहाँ साझा करने के लिए उत्तेजित नहीं करता है। मेरा मानना ​​है कि डाउनवोटिंग को दूर करने के लिए पर्याप्त है।
वेबकॉमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.