非対話的に対話型プログラムに引数を渡す


113

readコマンドを使用してインタラクティブにコマンドの引数を読み取るbashスクリプトがあります(たとえば、yes / noオプション)。デフォルトのオプション値を引数として渡す非インタラクティブスクリプトでこのスクリプトを呼び出す方法はありますか?

対話型スクリプトに渡す必要があるのは、1つのオプションだけではありません。


2
stdinから読み取っている場合は、入力をパイプすることができます
lc。

4
この質問には多くの重複があるので、対話型プログラムがどの言語で書かれているかは問題ではないことを指摘する価値があります。これは、標準入力を読み取るCプログラム、Erlangアプリケーション、またはその他の可能性があります。コマンドラインから実行され、不愉快にインタラクティブな入力を要求するものがあり、それを自動化したいと考えています。
tripleee 2017年

もちろん、不快なアプリケーションを制御できる場合は、(構成ファイル、コマンド行オプションなどを介して)非対話的に回答を読み取ることができるように、アプリケーションを書き直してください。これは、インタラクティブな質問の順序や表現の変更に対して、はるかに信頼性が高く、堅牢です。
Tripleee

回答:


46

より複雑なタスクについてはexpecthttp://en.wikipedia.org/wiki/Expect)があります。基本的にユーザーをシミュレートします。特定のプログラム出力や関連するものにどのように反応するかをスクリプトにコーディングできます。

これは、sshパスワードのパイピングを禁止するような場合にも機能します。


8
... SSHの場合の適切な解決策は、公開鍵認証に切り替えることですが。
tripleee 2017年

154

たくさんの方法

入力をパイプする

echo "yes
no
maybe" | your_program

ファイルからリダイレクト

your_program < answers.txt

ヒアドキュメントを使用してください(これは非常に読みやすい場合があります)

your_program << ANSWERS
yes
no
maybe
ANSWERS

ヒア文字列を使用

your_program <<< $'yes\nno\nmaybe\n'

5
これは、プログラムが標準入力を読み取った場合にのみ機能することを指摘しておきます。一部のプログラムは、標準入力がパイプである場合でも、たとえばパスワードをインタラクティブに読み取るために邪魔になります。パスワードの場合、これはセキュリティ上の理由から理にかなっています。ただし、一部の対話型プログラムは単に不十分に設計されています。
tripleee 2017年

@tripleeeあなたが言ったことに沿って、スクリプトはstdinの影響を受けないパスワードをどのように読み取りますか?readstdinを取得するために使用できることはわかっていますが、説明したことを行うために使用できる機能は何ですか?
flow2k 2017年

その場合、対話しようとしているプログラムに入力を送信する特別な方法(sshpass、ssh-agentなど)があるかどうかを確認するか、expectを使用して対話をスクリプト化する必要があります。
グレンジャックマン2017年

2
Expectのようなプログラムは、クライアントを疑似ttyの下で実行し、端末とキーボードをもう一方の端に持っているユーザーがいるようなクライアントに見えます。通常のパイプではそれはできません。
Tripleee

重要なお知らせ。提供されたコマンドにスペースを追加すると、これは機能しません。
71GA 2018

13

データをファイルに入れて、次のようにリダイレクトできます。

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

スクリプトのデータ:

$ cat data.txt
2
3

スクリプトの実行:

$ file.sh < data.txt
2
3

7

もう1つ方法を追加したいだけです。他の場所で見つけた、そして非常に簡単です。コマンド「execute_command」のコマンドラインですべてのプロンプトにyesを渡したいとすると、単純にyesにパイプします。

yes | execute_command

これはすべてのyes / noプロンプトへの回答としてyesを使用します。


1

printfを使用して、入力をスクリプトにパイプすることもできます。

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh

0

もう一つの代わりは

echo "something" | tee /path/to/file

teeコマンドは、受け取った入力を画面に出力し、同時にファイルに保存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.