web-dev-qa-db-ja.com

ターミナルなしで実行可能ファイルとして実行するときにbashスクリプトからユーザー入力を取得するにはどうすればよいですか?

ユーザー入力を受け取り、入力に従って処理するbashスクリプトを作成しようとしています。

スクリプトは実行可能であり、シバンがあります。

スクリプトは次のようになります。

#!/bin/bash
read name -p "Enter your name" 
echo $name >> namelist.txt

ユーザーにターミナルでスクリプトを開かせたくありません。スクリプトが実行可能になり(chmod + x)、スクリプトをダブルクリックすると実行されます。ただし、入力を受け取るために一時停止することはなく、ファイルは空のままです。

2

ユーザー入力用のGUIまたは端末が必要です。ユーザーがNautilusなどでスクリプトを開くと、stdinがないため、readはすぐに戻ります。考えられる解決策の1つは、スクリプトで新しいターミナルを開き、次のように実行することです。

x-terminal-emulator -e $0

X-terminal-emulatorを使用すると、デフォルトのターミナルエミュレータが呼び出されます。これはDebianとUbuntuで動作しますが、他のディストリビューションについては知りません。もちろん、xterm、konsole、その他の端末などの特定の端末を呼び出すことができます。

$0はスクリプトのファイルパスであるため、これは常に機能します。

また、それがより多くの端末を再帰的に開かないことを確認する必要があります。これが機能する1つの方法は、とにかくすでに行っているように、stdinから読み取ることができるかどうかを確認することです。

ファイルの終わり文字が検出されない限り、読み取りがタイムアウトした場合、または無効なファイル記述子が-uオプションの引数として指定された場合を除き、読み取りコマンドの戻りコードはゼロです。

したがって、戻り値を確認します。!= 0の場合は、上記のように新しいターミナルを開きます。そうでない場合は開きません。

例:

#!/bin/bash

read -p "Enter first value: " first
# Check return value of last command with $?
if [[ $? != 0 ]]; then
        x-terminal-emulator -e $0
else
        echo $first
        read -p "Enter more: " more
        echo $more
fi

プログラムの終了後に端末を開いたままにする必要がある場合は、 この質問 を参照してください。

2
Lasse Meyer

ランダムなヒットと試行が私を解決に導きました。

Nautilusで実行可能ファイルをダブルクリックすると、ポップアップが開き、スクリプトを(コンソールなしで)「実行」するか、「ターミナルで実行」するか、デフォルトのテキストエディタでスクリプトを「開く」かを尋ねられます。

「ターミナルで実行すると目的が達成されます」を選択します。

0