2009-10-13 22 views
7

私は、ファイルからコマンドを読み込むように設計されていないプログラム(私は書いていない)を持っています。 STDINにコマンドを入力するのはかなり面倒なので、コマンドをファイルに書き込んで再利用することで自動化したいと思っています。問題は、プログラムがEOFに遭遇した場合、次のコマンドを読み込もうと無限にループして、メニューオプションの無限トレントを画面にドロップします。パイプのコマンドでファイルの内容をSTDINに切り替えますか? (Linux Shell)

私ができることをしたいのは、パイプを介してプログラムにコマンドを含むファイルをcatした後、シェルの魔法を使って、ファイルのEOFに当たったときにファイルからSTDINに切り替えることです。

注:私は既にSTDINに ' - 'をつけてcatを使うことを考えました。残念なことに(これは以前は分かりませんでしたが)、パイプコマンドは、第1プログラムの出力が終了するのを待ってから、第2プログラムを開始します。この種のパイピングアクションと並行してプログラムを実行する方法があれば、それはうまくいくでしょう!

どのような考えですか?助けてくれてありがとう!

EDIT:

私は私の目標は、コマンドファイルの末尾を打つからシステムを防ぐためだけではないことに注意してください。私は、ファイルがEOFに達すると、キーボードからコマンドを入力し続けたいと思っています。

答えて

15

私は

 
(cat your_file_with_commands; cat) | sh your_script 

そのように、コマンドでファイルが実行されたときに、第二catはあなたが標準入力、その後に入力するものは何でもしてスクリプトを養うような何かをするだろう。

+2

あなたは*することができますか?*私はあなたがコマンドをグループ化することは考えていませんでした。それは私の何か新しいことです。これにより、私は第2のウィンドウを使用する必要がなくなりました - 大変ありがとう、Idelic! – zslayton

+0

興味のある人は、次のコマンドを使ってファイルをビルドすることができます:(cat your_file_with_commands; tee -a your_file_with_commands)| shのyour_scriptは、各コマンドをファイルに追加するだけでなく、パイプを介してスクリプトに渡します。 – zslayton

+0

+1これはintruded.netのナルニアwargameのレベル1で私を助けました – chmeee

1

tail -f commandfile | commandのようなものを試したことがありますか?後でファイルディスクリプタを閉じることなく、ファイルの行をコマンドにパイプする必要があると思います。 -nを使用して、tail -fがすべてを捕まえない場合は、パイプする行数を指定してください。

+0

良いアイデアだが、残念ながら私は、ファイルが完了した後にコマンドを入力し続けることはできません。ファイルを読み込んだ後にSTDINに切り替えるために 'tail -f commandfile - 'と入力すると、それは文句を言う: 警告:私は、標準入力を無限に続けても効果がありません 考えてくれてありがとうございます! – zslayton

+1

'echo something >> commandfile'を使ってファイルに行を追加しようとしましたか? 'tail -f'はそれらの追加も追跡するべきです。 –

+0

ハ!私はちょうどそれを試みていた*。それがうまくいくと私は再びコメントします。 (プログラムには時間がかかります) – zslayton

2

私はexpectと思っていました。

2

より簡単な構文でIdelicの答えと同じ;)

cat your_file_with_commands - | sh your_script 
関連する問題