コマンドラインに入力を自動的に入力する


142

各操作で 'y'を入力するように要求するスクリプトを実行しています$ ./script < echo 'yyyyyyyyyyyyyy'。すべての入力を一度に渡すようなソリューションを探しています。


時には-fオプションは、特定のコマンドでうまく動作します。
iammilind

回答:


258

その場合のために特別に作成されたコマンドがあります: yes

$ yes | ./script

これは、の出力yesをの入力に接続します./script。したがって、./scriptユーザー入力を要求すると、代わりにの出力を取得しますyes。の出力は、改行yesy続く無限のストリームです。基本的には、ユーザーがのyすべての質問に対して入力しているようです./script

nyes(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は文句を言います。


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、スクリプトが新しいターミナルで開き、通常どおり手動で入力するように求められます。ところで、これはDebianで起こっています。助言がありますか?
DavidB

詳細が必要です。コメントするには大きすぎます。すべての詳細を記載した新しい質問をしてください。ここにリンクを配置できます。
レスマナ

何もCentOSの上で「放浪破壊」で動作しない
ドリュー

簡単だ!Google Cloud Beta SQLデータのインポートで動作します!とても有難い!
G_Style

11

次のコマンドを使用し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'.

9

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シェルスクリプトで使用することはできませんよね?それとも方法はありますか?
シャヤン

7

シェルスクリプトでは、次のspawn、expect、sendのトリックも使用できます。

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

ただし、上記のscenerioでは、スクリプトの実行中に取得する予定のフレーズを指定する必要があります。その他の例については、次のリンクを参照してください。

Bash内で期待する


2

さて、これは非常にエレガントなソリューションではないかもしれませんが、別のファイルにオプションを記述し、それをスクリプトへの入力として渡すと、同様に機能します。したがって、すべてのオプションを使用して新しいファイルを作成する場合(このファイルを「options.in」と呼びます)、スクリプトを簡単に実行し、./script.sh < options.inさまざまなオプションファイルを適切に編集/作成できます。


options.inファイルをどのように書きますか?例を挙げていただけますか?
シャヤン

0

私はDialogでbashスクリプトを書いていましたが、これも自動的に行われる必要がありました。私はこれをしました、そしてそれは魅力のように働きました。

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

-1

次のようにcat、テキストファイルからスクリプトにパイプされたスクリプトを使用して、スクリプトにユーザー入力を提供できますbash

cat input.txt | bash your_script.sh

y、n、数字、文字列など、必要な答えが何であれ、目的のユーザー入力をinput.txtファイルに入力するだけです。



@muru私にとって、あなたが言及した解決策はうまくいかなかったので、私は自分で解決しなければなりません。
WebComer

ありそうもない。どちらも同じことを説明しています。
ムル

@muru同様に、ファイルから回答を提供するというアイデア(これはいくつかの方法で行うことができます)は同じものではなく、さらにまったく異なる方法で達成されました。あなたはそれを見ることができるはずです。あなたが指摘した解決策が私にとってうまくいくなら、私は今日車輪の再発明に時間を費やしません。あなたはあなたのために何でも使うことができます。
WebComer

@muruこの2つには違いがあると思いますが、回答に記載されているもののいくつかはここaskubuntu.com/questions/172982/…にあります。たとえば、出力がファイルにリダイレクトされる場合の私のコードは、左から右への自然な流れとしてより明確に見えます。結局のところ、あなたのようなうまく機能するソリューションをダウンボットしても、人々がここで彼らのソリューションを共有するように刺激することはありません。言われただけで、投票権を取り除けます。
WebComer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.