ユーザーに入力を要求し、後でいくつかの処理を実行するスクリプトを作成しています。もともと私はデータを取得するために使用しましたが、read
キーボードショートカットを使用してスクリプトを実行したとき(Ubuntuのキーボードショートカットリストに項目を追加しました)、残りのread
コードを無視して実行し続けることがわかりました。
このように、バックグラウンドで実行されるスクリプトを使用してユーザー入力をどのように読みますか?
答え1
私が正しく理解したら、端末内部ではなくGUI環境でスクリプトを直接実行しています。
ターミナルは、スクリプトが入力を受け取る方法を提供します。メニュー項目またはキーボードショートカットを介してGUIからスクリプトを実行すると、スクリプトの入力は何も接続されません(これを「コンテンツなし」と呼びます)。/dev/null
)、したがって1行を読み取るように要求すると、read
コマンドは読み取る内容がないと言います(ファイルの終わり)。
2つの回避策があります。スクリプトの呼び出し方法を変更するか、スクリプトを変更することです。前者はより簡単で、時には端末内でスクリプトを実行することができます。後者はより複雑ですが、より柔軟です。
端末で実行するスクリプトを簡単に変更できます。キーボードショートカットを設定する代わりに、目的の端末/path/to/script
エミュレータのキーボードショートカットを設定します。キーを押すと端末ウィンドウが表示され、スクリプトが終了すると消えます。xterm -e /path/to/script
gnome-terminal -e /path/to/script
あるいは、標準入力ではなくGUIウィンドウから入力を読み取るようにスクリプトを変更することもできます。ジェニティ一般的な選択です(Ubuntuパッケージ ジェニティのインストール 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