web-dev-qa-db-ja.com

プログラムでgnomeターミナルを開き、bashrcの実行後にコマンドを実行します

開発環境を開始するために、小さなスクリプトを書きました。 1つは、いくつかのコマンドが自動的に実行されるいくつかのタブを含むgnomeターミナルを開くことです。それらのコマンドのいくつかは、すでに実行された.bashrcに依存しています。しかし、使用するとき

gnome-terminal --tab -e "コマンド" --tab --tab

コマンドは、.bashrcが実行される前に実行されます。自動化されたgnome-terminal -eを手動で使用されるものと同じように動作させる可能性はありますか? ( "cd/foo/bar"のようなコマンドでもgnome-terminal -eでは機能しません)

35
Zardoz

Gnome-terminalがbashを開始すると、コマンドの実行に関する限りループの外に出ます。これは、入力と出力のみを管理します。したがって、~/.bashrcが読み込まれた後に何かを実行するには、bashの協力が必要です。

まず、多くの場合、実際に~/.bashrcの後にコマンドを実行する必要はありません。たとえば、特定のディレクトリでターミナルを開くには、cd /foo/bar && gnome-terminalを使用するだけです。同様の方法で環境変数を設定できます:VAR=value gnome-terminal。 (~/.bashrcが環境変数をオーバーライドする場合、それは間違っています: 環境変数の定義は~/.profile に属しています)

ターミナルでコマンドを実行するには、~/.bashrcの前に、

gnome-terminal -x sh -c 'command1; command2; exec bash'

複数のタブを使用する場合は、-eではなく-xを使用する必要があります。 Gnome-terminalは、シェルを介して実行するのではなく、-eの引数をスペースで分割することに役立ちます。それでも、スペースを含めないようにする場合は、シェルコマンドを記述できます。ただし、少なくともgnome-terminal 2.26では、タブを使用できます(<TAB>をリテラルのタブ文字に置き換えます)。

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

~/.bashrcの後にコマンドを実行する必要がある場合は、itでコマンドを実行します。たとえば、~/.bashrcの最後に次のコードを含めます。

eval "$BASH_POST_RC"

次に、bashrcの後に(実際には、最後に)いくつかのコードを実行します。

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

または(見積りの負担が少ない)

BASH_POST_RC='command1; command2' gnome-terminal

この方法での実行は特にお勧めしませんが、 コマンドラインに特定のテキストがすでに入力されている状態で端末を起動するにはどうすればよいですか? .

-eオプションを使用すると、gnome-terminalは新しいシェルを開始せずにそのコマンドを実行します(gnome-terminal -e geditなどを実行することもできます)。したがって、コマンドをbash新しいターミナル/タブにシェルで移動するには、次のようにする必要があります。

gnome-terminal -x bash -c "command"

ただし、"command"が終了すると、ターミナル/タブも終了することに注意してください。

6
cYrus