जवाबों:
उस मामले के लिए विशेष रूप से बनाई गई एक कमांड है: 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
। और बैश शिकायत करता है क्योंकि फ़ाइल मौजूद नहीं है।
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
, और स्क्रिप्ट एक नए टर्मिनल में खुलती है और मुझे अपने इनपुट को मैन्युअल रूप से सामान्य रूप से दर्ज करने के लिए कहती है। यह रास्ते में डेबियन पर हो रहा है। कोई सुझाव?
कमांड का उपयोग करें 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'.
कुछ चीजें ( 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
शेल स्क्रिप्ट के साथ उपयोग नहीं किया जा सकता है , है ना? या कोई रास्ता है?
शेल स्क्रिप्ट में आप स्पॉन के निम्नलिखित ट्रिक का उपयोग कर सकते हैं, उम्मीद और भेज सकते हैं
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
हालाँकि उपरोक्त श्रोणीओ में आपको वह वाक्यांश देना होगा जो आप प्राप्त करने की उम्मीद कर रहे हैं जब आप स्क्रिप्ट का निष्पादन करते हैं तो अधिक उदाहरणों के लिए निम्न लिंक पर जाएं
ठीक है, यह एक बहुत ही सुंदर समाधान नहीं हो सकता है, लेकिन यदि आप एक अलग फ़ाइल में अपने विकल्प लिखते हैं और फिर इसे स्क्रिप्ट के इनपुट के रूप में पास करते हैं, तो यह भी काम करेगा। इसलिए यदि आप अपने सभी विकल्पों के साथ एक नई फ़ाइल बनाते हैं (इस फ़ाइल को 'options.in' के रूप में कहते हैं), तो आप आसानी से अपनी स्क्रिप्ट चला सकते हैं ./script.sh < options.in
और उपयुक्त के रूप में विभिन्न विकल्प फ़ाइलों को संपादित / बना सकते हैं।
options.in
फ़ाइल कैसे लिखनी चाहिए ? क्या आप एक उदाहरण दे सकते हैं?
मैं डायलॉग के साथ एक बैश स्क्रिप्ट लिख रहा था और इसे अपने आप भी होने की जरूरत थी। मैंने ऐसा किया और यह एक आकर्षण की तरह काम करता है।
# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
आप cat
अपनी स्क्रिप्ट को bash
इस तरह से अपनी स्क्रिप्ट के साथ जोड़कर, एक टेक्स्ट फ़ाइल से उपयोगकर्ता इनपुट की आपूर्ति कर सकते हैं :
cat input.txt | bash your_script.sh
बस अपने वांछित उपयोगकर्ता इनपुट को अपने इनपुट में रखें। टेक्स्ट फ़ाइल, जो भी उत्तर आप चाहते हैं - y, n, अंक, स्ट्रिंग्स, आदि।
-f
विकल्प कुछ आदेशों के साथ अच्छी तरह से काम करता है।