他の人が作成してコンパイルした Python 実行ファイルがあり、それを自分の bash スクリプトの途中で 1 回実行するだけで済みます。プログラムはテキストベースの UI を使用するため、続行する前に入力を待機しますが、起動時に実行する主要な操作は、私の bash スクリプトで必要です。面倒な (そして奇妙な) 手順であることは承知していますが、残念ながら他に選択肢がありません。
強制終了シグナルでプログラムを強制終了する方法はありましたが、プログラムの TUI は実行されている場所に出力することを要求します。stdout と stderr の両方を /dev/null にリダイレクトし、末尾にアンパサンドを付けてプログラムをバックグラウンドで実行してみましたが、うまくいきません。原因は、プログラムが他のプロセスを生成し、親プロセスの出力リダイレクトがそれらに影響を与えないことにあると思います。子プロセスからのすべての出力もリダイレクトするために利用できるトリックはありますか?
答え1
unbuffer
プログラムはstdoutではなくttyに書き込んでいる可能性があります。付属のスクリプトを使用できる場合があります。expect
または、他の技術を使用したりexpect
、類似のものを使用したりします。
デモはこちらです。このスクリプトを作成し、「writetty」という名前を付けます。次に、次の操作を実行しますchmod u+x writetty
。
#!/bin/bash
date > /dev/tty
さあ試してみましょう:
$ ./writetty
Tue Jun 8 12:24:36 CDT 2010
$ ./writetty > /dev/null
Tue Jun 8 12:24:46 CDT 2010
$ var=$(./writetty)
Tue Jun 8 12:24:56 CDT 2010
$ unbuffer ./writetty > /tmp/writetty.out
$ cat /tmp/writetty.out
Tue Jun 8 12:25:06 CDT 2010
$ var=$(unbuffer ./writetty)
$ echo $var
Tue Jun 8 12:25:16 CDT 2010
expect
プログラムを終了する代わりに、 を使ってプログラムの入力要求に応答することができます。