各操作で「y」の入力を要求するスクリプトを実行しています。$ ./script < echo 'yyyyyyyyyyyyyy'
のような解決策を探しています。 すべての入力を一度に渡す。
ベストアンサー
その場合のために特別に作成されたコマンドがあります:yes
$ yes | ./script
これは、yes
の出力を接続します ./script
の入力に 。したがって、./script
ユーザー入力を要求すると、代わりにyes
の出力が取得されます 。 yes
の出力 y
の無限のストリームです 改行が続きます。つまり、基本的には、ユーザーがy
を入力しているかのようになります。 ./script
のすべての質問に対して 。
いいえと言いたい場合(n
)yesの代わりに(y
)次のように行うことができます:
$ yes n | ./script
一部のツールには、常にyes
を想定するオプションがあることに注意してください 答えとして。たとえば、ここを参照してください:「apt-getupgrade」でyes/noプロンプトをバイパスします
入力を入力する他の方法:
y
の数を正確に知っている場合 スクリプトは、次のように実行できることを期待しています:
$ printf 'ynynyn' | ./script
改行(n
)はEnterキーです。
printf
を使用する yes
の代わりに 入力をよりきめ細かく制御できます:
$ printf 'yesnnonmayben' | ./script
まれに、コマンドでユーザーが文字の後にEnterキーを押す必要がない場合があることに注意してください。その場合、改行は省略してください:
$ printf 'yyy' | ./script
完全を期すために、ヒアドキュメントを使用することもできます:
$ ./script << EOF
y
y
y
EOF
または、シェルがそれをサポートしている場合は、ここの文字列:
$ ./script <<< "y
y
y
"
または、1行に1つの入力でファイルを作成することもできます:
$ ./script < inputfile
コマンドが十分に複雑で、上記の方法では不十分な場合は、expectを使用できます。
非常に単純なexpectスクリプトの例を次に示します。
spawn ./script
expect "are you sure?"
send "yesr"
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は文句を言います。