විධාන රේඛාවේ ආදානය ස්වයංක්‍රීයව ඇතුළත් කරන්න


160

මම සෑම මෙහෙයුමකටම 'y' ඇතුල් කිරීමට ඉල්ලා සිටින ස්ක්‍රිප්ට් එකක් ධාවනය කරමි, $ ./script < echo 'yyyyyyyyyyyyyy'මගේ සියලු යෙදවුම් එකවර සම්මත කිරීම වැනි විසඳුමක් සොයමි .


සමහර විට -fවිකල්පය සමහර විධානයන් සමඟ හොඳින් ක්‍රියා කරයි.
iammilind

Answers:


287

එම අවස්ථාව සඳහා විශේෂයෙන් නිර්මාණය කරන ලද විධානයක් ඇත: yes

$ yes | ./script

මෙය කරන්නේ ප්‍රතිදානය yesආදානයට සම්බන්ධ කිරීමයි ./script. එබැවින් ./scriptපරිශීලක ආදානය ඉල්ලා සිටින විට එය ප්‍රතිදානය ලබා ගනී yes. ප්‍රතිදානය yesනිමක් නැති ප්‍රවාහයක් වන yඅතර එය නව රේඛාවක් අනුගමනය කරයි. එබැවින් මූලික වශයෙන් පරිශීලකයා yසෑම ප්‍රශ්නයක් සඳහාම ඇතුළු වේ ./script.

ඔබට nඔව් ( y) වෙනුවට නැත ( ) යැයි පැවසීමට අවශ්‍ය නම් ඔබට එය මේ ආකාරයෙන් කළ හැකිය:

$ yes n | ./script

සමහර මෙවලම් වලට සෑම විටම පිළිතුර yesලෙස උපකල්පනය කිරීමට විකල්පයක් ඇති බව සලකන්න . උදාහරණයක් ලෙස මෙහි බලන්න: 'apt-get update' හි ඔව් / නැත විමසුම මඟ හරින්න


ආදානය ඇතුළත් කිරීමට වෙනත් ක්‍රම:

yඔබගේ ස්ක්‍රිප්ට් කීයක් අපේක්ෂා කරනවාදැයි ඔබ හරියටම දන්නේ නම් ඔබට එය මේ ආකාරයෙන් කළ හැකිය:

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

නව රේඛා ( \n) යනු යතුරු ය.

ඔබ printfවෙනුවට භාවිතා yesකිරීම ආදානයේ වඩාත් සියුම් පාලනයක් ඇත:

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

සමහර දුර්ලභ අවස්ථාවන්හිදී විධානය මඟින් පරිශීලකයාට අක්‍ෂරයෙන් පසුව Enter එබීම අවශ්‍ය නොවන බව සලකන්න. එවැනි අවස්ථාවක නව රේඛා ඉවත් කරන්න:

$ 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'අතර stdin නම් කරන ලද ගොනුවකින් ආදානය ලැබෙනු ඇත echo. ගොනුව නොපවතින බැවින් bash පැමිණිලි කරයි.


1
මට අ cannot enable tty mode on non tty input. ඒ සඳහා වන ක්‍රියාමාර්ගයක් ඔබ දන්නවාද?
bmpasini

ස්ථාපන ක්‍රියාවලිය ස්වයංක්‍රීය කිරීමට අවශ්‍ය ගොනුවක් printfසමඟ මම උපක්‍රමය උත්සාහ කරන විට run, සිදුවන්නේ මට දෝෂ පණිවිඩයක් ලැබීමයි Warning: Tried to connect to session manager, None of the authentication protocols specified are supported, ස්ක්‍රිප්ට් නව පර්යන්තයකින් විවෘත වී සුපුරුදු පරිදි මගේ ආදානය අතින් ඇතුල් කරන ලෙස ඉල්ලා සිටී. මෙය ඩෙබියන් හි සිදුවෙමින් පවතී. යෝජනා තිබේද?
ඩේව්මීනියන්

වැඩි විස්තර අවශ්‍යයි. අදහස් දැක්වීමට වඩා විශාලයි. කරුණාකර සියලු විස්තර සහිත නව ප්‍රශ්නයක් අසන්න. ඔබට මෙහි සබැඳියක් තැබිය හැකිය.
lesmana

සෙන්ටෝස් මත 'වැග්‍රන්ට් ඩිස්ට්‍රි' සමඟ කිසිවක් ක්‍රියා නොකරයි
ඩ්‍රූ

දුෂ්ට පහසුයි! ගූගල් වලාකුළු බීටා SQL දත්ත ආනයනය මත ක්‍රියා කරයි! බොහෝ අගය කළා!
G_Style

12

විධානය භාවිතා කරන්න 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නිදසුනක් ලෙස) නිහ silent ප්‍රකාරයේදී ක්‍රියාත්මක වීමට විශේෂ කොඩි පිළිගනී (සහ පෙරනිමි පිළිගන්න). දී 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"

කෙසේ වෙතත්, ඉහත අවස්ථා වලදී, ඔබ ස්ක්‍රිප්ට් ක්‍රියාත්මක කරන අතරතුර ලබා ගැනීමට අපේක්ෂා කරන වාක්‍ය ඛණ්ඩය ලබා දීමට සිදුවනු ඇත.

Bash තුළ බලාපොරොත්තු වන්න


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

0

catපෙළ ගොනුවකින්, ඔබේ ස්ක්‍රිප්ටයට නල මාර්ගයෙන් ඔබේ ස්ක්‍රිප්ටයට පරිශීලක ආදානය සැපයිය හැකිය bash:

cat input.txt | bash your_script.sh

ඔබට අවශ්‍ය ඕනෑම පිළිතුරක් - y, n, ඉලක්කම්, නූල් ආදිය ඔබේ input.txt ගොනුවට ඇතුළත් කරන්න.



urmuru මට නම්, ඔබ සඳහන් කළ විසඳුම සාර්ථක වූයේ නැත, එබැවින් මට මගේම දෑ නිර්මාණය කළ යුතුය.
වෙබ්කොමර්

බලාපොරොත්තු විය නොහැක. ඔබ දෙදෙනාම එකම දේ විස්තර කරයි.
මුරු

ur මුරු සමාන ගොනුවකින් පිළිතුරු සැපයීම පිළිබඳ අදහස (එය ක්‍රම කිහිපයකින් කළ හැකිය) එකම දෙයක් නොවන අතර එපමනක් නොව එය වෙනස් ආකාරයකින් ඉටු කර ඇත. ඔබට එය දැක ගත හැකි විය යුතුය. ඔබ පෙන්වා දෙන විසඳුම මට ප්‍රයෝජනවත් නම්, මම අද රෝදය ප්‍රතිනිර්මාණය කිරීමට මගේ කාලය වැය නොකරමි. ඔබට ඕනෑම වැඩක් භාවිතා කළ හැකිය.
වෙබ්කොමර්

ur මුරු මේ දෙක අතර වෙනසක් ඇති බව මම විශ්වාස කරමි, ඒවායින් සමහරක් පිළිතුරු වලින් විස්තර කර ඇත askubuntu.com/questions/172982/… . උදාහරණයක් ලෙස, මගේ කේතය ප්‍රතිදානය ගොනුව වෙත හරවා යවනු ලැබුවහොත් වමේ සිට දකුණට ස්වාභාවික ප්‍රවාහයක් ලෙස වඩාත් පැහැදිලිව පෙනේ. සියල්ලට පසු, ඔබ වැනි හොඳ විසඳුම් පහත් කොට සැලකීම ඔවුන්ගේ විසඳුම් මෙහි බෙදා ගැනීමට මිනිසුන් උත්තේජනය නොකරයි. පහත් කිරීම ඉවත් කිරීමට එය ප්‍රමාණවත් යැයි මම විශ්වාස කරමි.
වෙබ්කොමර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.