最初に、これがあなたの問題にアプローチする正しい方法だとは思わないことを言わせてください。まったく。アプリケーション固有のより優れたソリューションが必要であり、実際にそれを見つける必要があります。
主な問題は、どのプログラムを「強制終了」させたいかを知らなければ、それらを「エラーアウト」させる方法がわからないことです。また、プログラムを知っている場合は、CodeGnome のソリューションで問題ないようです。
また、すべてのプログラムが STDIN から直接入力を読み取るわけではないことに注意してください。たとえば、Python の getpass モジュールは追加のファイル記述子を に直接開くため、/dev/tty
STDIN を閉じたりリダイレクトしたりしても問題ありません。これはsudo
パスワードを受け入れる方法でもあり、ncurses も同様に機能すると思います。このように読み取ると、パスワードを画面に表示せずに取得できます。
/dev/tty
(例: bash の)から直接読み取らないプロンプトの場合は、 (例: )read
から STDIN をリダイレクトするだけで、どこかへ行けるかもしれません。または、現在行っていることを実行して STDIN を閉じることもできますが、閉じられた STDIN または EOF のみで構成されるリダイレクトされた STDIN に遭遇したときのプログラムの動作は制御できません。 プログラムが思い通りにエラーを出すことを願っていますが、有効な入力を期待してループし続けるかもしれません。知るか?/dev/null
./prompt.sh </dev/null
さらに、閉じることもリダイレクトすることも、グローバルに機能する方法ではありません。一部のプログラムは、閉じた STDIN を期待して終了する場合があります。他のプログラムは、からの EOF が必要な場合があります。/dev/null
したがって、これを行う方法は、一般的な包括的なタイプのソリューションではなく、その場所に配置するプログラムに合わせたものです。さらに良いのは、try (プログラムを実行するため) とcatch (プログラムが入力を要求する場合) メソッドを使用せず、入力を要求しないことがわかっている方法でプログラムを呼び出すことです。
とにかく、そうは言っても、うまくいく可能性がある1つの可能性は、STDINを閉じてプロセスをバックグラウンドにすることです。例えば:
#!/bin/bash
exec 0<&-
./prompt.sh &
または、STDIN を /dev/null にリダイレクトし、プロセスをバックグラウンドにします。例えば:
#!/bin/bash
./prompt.sh </dev/null &
次に、プログラムのリターン コード ( を使用$?
) をチェックして、プログラムが正しく終了したかどうかを確認する必要があります。(使用しているプログラムの不明なリストが標準の戻り値スキームに従っていることを願っています)
STDIN のクローズ / リダイレクトは、STDIN が入力を受け入れるために使用されるケースを処理し、プロセス/dev/tty
のバックグラウンド処理は (バックグラウンド処理されたプロセスには tty がないため) ケースを処理します。
プログラムが他の方法を使用してプロンプトを表示した場合 (疑似端末に直接 FD を開く、グラフィック入力ボックスをポップアップする、可聴プロンプトを表示するなど)。