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


35

開発環境を開始するために、簡単なスクリプトを作成しました。1つの部分は、いくつかのコマンドを自動的に実行する複数のタブでgnome端末を開くことです。これらのコマンドの一部は、既に実行された.bashrcに依存しています。しかし、使用する場合

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

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

回答:


45

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、シェルを介して実行するのではなく、atスペースの引数を役に立たないように分割します。それでも、スペースを含めないようにすれば、シェルコマンドを作成できます。少なくとも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、作ることがコマンドを実行します。たとえば、次のコードを最後に含めます~/.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

この方法で行うことは特にお勧めしませんが、コマンドラインに特定のテキストがすでに入力されている状態で端末を起動する方法で説明したテクニックに興味があるかもしれません


はい、確かに素晴らしいトリックです。考えたこともありません。ここで、特定のタブに対してBASH_POST_RC変数を異なる方法で設定する方法を見つける必要があります。そして、それはまだ問題のようです。単純な「gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab」は使用できません:-(
Zardoz

@Zardoz:実際には、タブ文字を使用してgnome-terminalをだますことができます(私の修正された答えを参照)。引用の複数のレベルに注意してください。
ジル「SO-悪であるのをやめる」

..動作します:-) ...ソリューションと忍耐に感謝します。ここに私の完全なコマンド(コマンド内のスペースでも動作します:gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rails server \ "; exec bash" '--tab -e' bash -c "export BASH_POST_RC = \" autotest \ "; exec bash" '--tab
Zardoz

ようやく機能しました...引用符で囲まれた多くのテストが終わりました。ここでのzshを使って、一度にサーバーとコンソールを開いて、私のものです:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
オーギュRiedinger

1
@terdonいいえ、gnome-terminal -eシェルをまったく起動しません。あなたが実行した場合gnome-terminal -e 'sleep 9'、そのコマンドを実行しsleep、引数で9、そして何のシェルが関与していません。実行するgnome-terminal -e 'sleep 9;bash'と、ターミナルは開いたり閉じたりします。これは有効な時間間隔sleep9;bashはないと文句を言うからです。あなたは何が起こっているのかを観察することができますstrace -f -eexecve gnome-terminal -e …
ジル「SO-悪であるのを止めてください」

6

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

gnome-terminal -x bash -c "command"

ただし、"command"終了すると端末/タブも終了することに注意してください。


1
私はあなたが意味すると思うgnome-terminal -x bash -c "command"-e単一の引数を期待する)。そしてcommand、少なくとも1つのタブを開始している限り、後でシェルを実行するのはかなり簡単です。私の答えを参照しください。
ジル「SO-悪であるのをやめる」

gnome-terminal -x "bash" -c "command"私のために働いた。-x arg値の引用符に注意してください。
m3nda

私が取得# Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
-x-eオプトンが非推奨になったので、私たちは何をしますか?
ナイクシー

~/.bashrcOPによって最初に要求されたように、これはコマンドを実行する前に実行されないと考えています。
IgNite
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.