මම සෑම මෙහෙයුමකටම 'y' ඇතුල් කිරීමට ඉල්ලා සිටින ස්ක්රිප්ට් එකක් ධාවනය කරමි, $ ./script < echo 'yyyyyyyyyyyyyy'
මගේ සියලු යෙදවුම් එකවර සම්මත කිරීම වැනි විසඳුමක් සොයමි .
මම සෑම මෙහෙයුමකටම 'y' ඇතුල් කිරීමට ඉල්ලා සිටින ස්ක්රිප්ට් එකක් ධාවනය කරමි, $ ./script < echo 'yyyyyyyyyyyyyy'
මගේ සියලු යෙදවුම් එකවර සම්මත කිරීම වැනි විසඳුමක් සොයමි .
Answers:
එම අවස්ථාව සඳහා විශේෂයෙන් නිර්මාණය කරන ලද විධානයක් ඇත: 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 පැමිණිලි කරයි.
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
නිදසුනක් ලෙස) නිහ 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
ෂෙල් ස්ක්රිප්ට් එකකින් භාවිතා කළ නොහැක , නේද? නැත්නම් ක්රමයක් තිබේද?
ෂෙල් ස්ක්රිප්ටයේ ඔබට පහත දැක්වෙන උපක්රම භාවිතා කළ හැකිය, අපේක්ෂා කරන්න සහ යවන්න
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, ඉලක්කම්, නූල් ආදිය ඔබේ input.txt ගොනුවට ඇතුළත් කරන්න.
-f
විකල්පය සමහර විධානයන් සමඟ හොඳින් ක්රියා කරයි.