web-dev-qa-db-ja.com

1つのbashスクリプトから複数の画面セッションを起動するにはどうすればよいですか?

私は次のようなスクリプト(動作しません)を作成しました:

#!/bin/sh

screen -dmS "somename" somecommand

for i in {0..5}; do
    screen -dmS "name$i" anothercommand $i
done

何らかの理由で、これをコピーして端末に貼り付けると、期待どおりに7つの切り離された画面セッションが作成されます。ただし、スクリプト内から実行すると、screen -lsを実行すると、最初のセッション「somename」しか取得されません。

編集:同じことが別の方法で達成できる場合(たとえば、セッションの代わりに複数の画面ウィンドウを使用する場合)、それらのソリューションも開きます。ありがとう!

8
Eric

私はこの質問をStackOverflowに持ち込み、 Brian Gerard が質問に答えました。 {0..5}ループ構文はbash(3.x +)固有です。デフォルトでは、私のシステムは/bin/shから他のシェルを実行するように設定されていたので、シャープバンを#!/bin/bashに変更し、問題は解決しました。

6
Eric

なぜこれほど多くのスクリーンセッションを開く必要があるのですか?代わりに、単一の画面セッション内に複数のウィンドウ(つまり、単一画面のターミナルウィンドウの一部として)を作成してみませんか。作成した数と出力を表示する数に応じて、ctrl-a1または2または3などでそれらを切り替えることができます。

これは、画面を実行するための悪いアプローチのように聞こえます。画面に複数のウィンドウがあることを聞いたことがない場合は、Web上の画面にあるチュートリアルを読んでください。 Screenの主な設計目標は、ウィンドウの多重化です。これは、アタッチとデタッチだけではありません。

4
bagavadhar

残念ながら、私はあなたの コメント に答えることができません。私は評判が低すぎるので、別の答えに入れなければなりません。

screenrc構成ファイルを使用して、複数のウィンドウで単一画面のセッションを作成できます。 画面のマンページ はすべてを教えてくれますが、問題を解決するために必要な最も重要なことは次のとおりです。

次のscreenrcは、2つのウィンドウを持つ画面セッションを作成します。 1つのウィンドウはbashを実行し、もう1つのウィンドウはpythonを(インタラクティブに)実行します。

sessionname myscreensession
screen -t command1 0 bash
screen -t command2 1 python

名前myscreensessionは、screen -lsを実行するときに表示され、screen -rのパラメーターとして使用できます。文字列commandNは、画面セッション内のウィンドウ名を指定します。番号(0と1)は、コマンドを実行するウィンドウを指定します(後続の番号を使用する必要はありません)。

後で、実行中の画面セッションに新しいコマンドを含む別のウィンドウを追加することもできます。と:

screen -X screen -S myscreensession -t command3 2 python3

これにより、既存のセッションでpython3を実行する新しいウィンドウが作成されます。

2
Fred

スクリプトが機能しない理由はよくわかりませんが、複数の画面セッションを開始する別の方法は、カスタム画面構成ファイルを作成することです。このAskUbuntuの質問で議論されました: https://askubuntu.com/questions/49245/start-multiple-apps-running-in-shells-split-in-one-console

次の内容で設定ファイルtest.confを作成し、screen -d -c test.confを起動するだけでよいと思います。

screen -S "somename" somecommand
screen -S "name1" anothercommand 1
screen -S "name2" anothercommand 2
...

そしてそれが機能する場合、スクリプトは最初にこのtest.confファイルを作成し、ループ内でそれをカスタマイズすることができます

echo "screen -S "name$i" anothercommand $i" >> test.conf

次に、スクリプトの最後でscreen -d -c test.confを開始します。

0
jmbouffard