GNU/Linux >> Linux の 問題 >  >> Ubuntu

コマンドラインに入力を自動的に入力しますか?

各操作で「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は文句を言います。

関連:Ubuntuでサスペンドをデバッグする方法は?
Ubuntu
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. コマンドライン引数をシェルスクリプトに渡す方法は?

  3. パイプ入力の行ごとに1回コマンドを実行しますか?

  1. コマンドラインクリップボードアクセス?

  2. 行「!/bin/sh -e」は何をしますか?

  3. ./configure :/bin/sh^M :不適切なインタープリター

  1. コマンドライン引数をBashスクリプトに渡しますか?

  2. コマンドLinuxラインからのmatlab実行スクリプト

  3. コマンドラインでの < /dev/null &の使用