web-dev-qa-db-ja.com

バックグラウンドで実行中にユーザー入力を取得する

ユーザーに入力を求め、その後処理を行うスクリプトを書いています。 readを使用してデータを取得していましたが、スクリプトをキーボードショートカットで実行すると(Ubuntuのキーボードショートカットリストにエントリを追加しました)、readが無視されて続行されることに気付きました。残りのコードで。

このようにバックグラウンドで実行されているスクリプトを使用してユーザー入力を読み取るにはどうすればよいですか?

5
nmat

私が正しく理解していれば、ターミナル内からではなく、GUI環境から直接スクリプトを実行しています。

ターミナルは、スクリプトに入力を受け取る方法を提供するものです。メニューエントリまたはキーボードショートカットを介してGUIからスクリプトを実行する場合、スクリプトの入力は何にも接続されません(これは何も呼ばれません /dev/null )ので、行のreadコマンドは、読み取るものがない(ファイルの終わり)ことを示しています。

2つの解決策があります。スクリプトの呼び出し方法を変更するか、スクリプトを変更します。前者の方が単純で、スクリプトを端末内で実行できる場合があります。後者はより複雑ですが、より柔軟です。

ターミナルで実行するようにスクリプトを簡単に変更できます。 /path/to/scriptのキーボードショートカットを設定する代わりに、xterm -e /path/to/scriptまたはgnome-terminal -e /path/to/scriptまたは任意のターミナルエミュレーターのキーボードショートカットを設定します。ターミナルウィンドウは、キーを押すとすぐに表示され、スクリプトが終了すると消えます。

または、スクリプトを変更して、標準入力からではなく、GUIウィンドウから入力を読み取ることもできます。 Zenity が一般的な選択です( buntuパッケージzenity http://bit.ly/software-small をインストールします)。スクリプト内で、[ -t 0 ]を使用して、ターミナルで実行されているかどうかをテストできます。

if [ -t 0 ]; then
  echo "What is your favorite color?"
  read -r color
else
  color=$(zenity --entry --text "What is your favorite color?")
fi