複数のターミナルタブを開いてコマンドを実行する


9

複数のターミナルタブを開いてタイトルを付け、ディレクトリに移動して、各タブでコマンドを実行する必要があります。

私はLinuxとシェルスクリプトを初めて使用します。オンラインで検索していくつかの解決策を確認した後、このスクリプトを作成しました(以下の回答に基づいて編集):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

タブを開いて名前を付けますが、このエラーを生成するコマンドの実行に失敗します。

この端末の子プロセスの作成中にエラーが発生しました

もう1つの欠点は、実行中のコマンドを停止すると、タブが閉じてしまい、不要なことです。コマンドを停止して、同じタブ内で再度実行できるようにする必要があります。

スクリプトの何が問題になっていますか?それを行う別の簡単な方法はありますか?

注:コマンドから(-e "\" bash -c $ {cmds [i]}; bash \ "")の部分を削除すると、指定されたディレクトリのタブが開き、名前が付けられます。エラーは発生しません。

-編集-1:

以下の@Tuknutx回答を適用してスクリプトを編集すると、エラーは表示されなくbash: rails c: command not foundなりrails sますが、Railsサーバーを起動する代わりに新しいRailsアプリを作成します。このフォルダーにアクセスしたら、.rmvrcを使用してgemsetを選択します。


スクリプトをubuntuブートで実行する場合:-スクリプトをupstartサービス(help.ubuntu.com/community/UbuntuBootupHowto)として実行するか、デスクトップ環境で「スタートアップアプリケーション」を使用する
Aboelnour

私が書いcmds[1]="'ping 192.168.9.9'"た場合、同じエラーが表示されますが、単一引用符を削除することで解決しました。だから私が書くならcmds[1]="ping 192.168.9.9"それはうまくいく。
デイジー

@ブラリーですが、3つのタブが開く理由がわかりません。1つはデフォルトで、もう1つはスクリプトで設定されています。定義するのでtab=" --tab-with-profile=Default"??
デイジー

回答:


3

tmux一緒tmuxinatorに使用することをお勧めします。それはあなたのために仕事をし、あなたもterminatorレイアウトに依存することができます!

以下のためのterminatorレイアウトチェックアウトmhnagaokaの答えここにすぎaskubuntu:

  1. レイアウトを設定したら、端末の背景を右クリックして、[ 設定] → [ レイアウト ]タブを選択し、[ 追加 ]ボタンをクリックし ます。

  2. 名前を付けて[閉じる]をクリックします

  3. これにより、上記の~/.config/terminator/configファイルが作成されます。

  4. これで、保存したレイアウトを使用してターミネーターを開始できますterminator -l yourLayoutyourLayoutをステップ2で選択したものに置き換えます)。

  5. (オプション)~/.config/terminator/configファイルを編集して、その[layouts]下にネストされているように[[yourLayout]]yourLayoutの名前 をdefaultに変更し、以前のデフォルトのレイアウトを削除または名前変更します。これで、ターミネーターがパラメーターなしで起動すると、カスタム[[default]]レイアウトが読み込まれます。


2

他のいくつかの回答とそのコメントを要約すると、次のようになります。

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

「マスター」タブ、プロファイル、およびタイトル(で廃止予定のようですgnome-terminal)を削除したことに注意してください。


$tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.`Use“-” の出力は、オプションを終了し、その後にコマンドラインを実行します。. that's an output but the comands get executed. When i use $ tab-`コマンドは実行されず、ターミナルdsisplays:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee

1

これを試して:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

それ以外の場合、-eの後の式全体がコマンドとして解釈されます。

.bashrcのエイリアスを含める-icには、c


エラーはもう表示されません、ありがとうございます。しかし、それは私に与えbash: rails c: command not found、「rails s」はRailsサーバーを起動する代わりに新しいRailsアプリを作成します。これにより、質問の範囲が変更されます。スクリプトの変更を加えて編集します
Brary

rails c他に何もない端末を試してもうまくいきましたか?たぶんそうなのでしょうrails -cか?
TuKsn 14

うまくいかなかった。私も試してみましたrvm list gemsets、それは述べていますNo command 'rvm' found。..同じコマンドを実行するrvm list gemsetsコマンドを実行せずに開いた最初のタブでは、それが働きました!環境が読み込まれ、.rvmrcファイルが読み込まれる前にコマンドを実行しますか?
Brary、2014

1

-eオプションを指定する引数に"bash -c command; bash"引用符が含まれています。その文字列全体をコマンドの名前として解釈します!代わりにこれを試してください:-e "bash -c 'command ; bash'"。このように、ターミナルウィンドウで実行されるのは commandであり、その後、実行するとドーターシェルが提供されます。ちなみに、あなたも言うことができます'command & bash'。これにより、コマンドがバックグラウンドで実行され、すぐにドーターシェルが表示されます。


これoptions+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )をに変更するoptions+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )と、同じエラーが発生しました。
Brary、2014

不正解です。最初のbashの前に\ "を削除し、2番目のbashの後に 'を削除してください。
Silvio Levy

おかげで、私は質問を編集し、その範囲をrailsとrvmを含むように変更しました。
Brary、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.