ユーザーに入力を求め、その後処理を行うスクリプトを書いています。 read
を使用してデータを取得していましたが、スクリプトをキーボードショートカットで実行すると(Ubuntuのキーボードショートカットリストにエントリを追加しました)、read
が無視されて続行されることに気付きました。残りのコードで。
このようにバックグラウンドで実行されているスクリプトを使用してユーザー入力を読み取るにはどうすればよいですか?
私が正しく理解していれば、ターミナル内からではなく、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