回答:
その場合のために特別に作成されたコマンドがあります: yes
$ yes | ./script
これは、の出力yes
をの入力に接続します./script
。したがって、./script
ユーザー入力を要求すると、代わりにの出力を取得しますyes
。の出力は、改行yes
がy
続く無限のストリームです。基本的には、ユーザーがのy
すべての質問に対して入力しているようです./script
。
n
yes(y
)の代わりにno()と言いたい場合は、次のようにできます。
$ yes n | ./script
一部のツールには、常にyes
回答と見なすオプションがあることに注意してください。例についてはこちらをご覧ください。「apt-get upgrade」でyes / noプロンプトをバイパスします
入力を入力する他の方法:
y
スクリプトが期待している正確な数がわかっている場合は、次のようにできます。
$ printf 'y\ny\ny\n' | ./script
改行(\n
)はEnterキーです。
printf
代わりに使用するとyes
、入力をよりきめ細かく制御できます。
$ printf 'yes\nno\nmaybe\n' | ./script
まれに、このコマンドでは、ユーザーが文字の後にEnterキーを押す必要がないことに注意してください。その場合、改行は省略します。
$ printf 'yyy' | ./script
完全を期すために、hereドキュメントも使用できます。
$ ./script << EOF
y
y
y
EOF
または、シェルがhere文字列をサポートしている場合:
$ ./script <<< "y
y
y
"
または、1行に1つの入力があるファイルを作成できます。
$ ./script < inputfile
コマンドが十分に複雑で、上記の方法では不十分な場合は、expectを使用できます。
以下に、非常に単純なexpectスクリプトの例を示します。
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
、スクリプトが新しいターミナルで開き、通常どおり手動で入力するように求められます。ところで、これはDebianで起こっています。助言がありますか?
次のコマンドを使用しyes
ます。
yes | script
manページからの抜粋:
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
フラグを。ただし、これはスクリプトに完全に依存します。
さらに複雑なものが必要な場合は、スクリプトをexpectスクリプトにラップできます。expectを使用すると、出力を読み取って入力を送信できるため、他のスクリプトでは許可されない非常に複雑な処理を実行できます。Wikipediaページの例の1つを次に示します。
# 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、expect、sendのトリックも使用できます。
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
ただし、上記のscenerioでは、スクリプトの実行中に取得する予定のフレーズを指定する必要があります。その他の例については、次のリンクを参照してください。
私はDialogでbashスクリプトを書いていましたが、これも自動的に行われる必要がありました。私はこれをしました、そしてそれは魅力のように働きました。
# -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
オプションは、特定のコマンドでうまく動作します。