シェルスクリプトで実行可能な呼び出しを他の機能に分割するには?

シェルスクリプトで実行可能な呼び出しを他の機能に分割するには?

これが私が達成したいものです。

#!/bin/bash

function startBasics()
{
    gnome-terminal -e "sth" &
    gnome-terminal --tab -e "sth_else" &
}

function doOneThing()
{
    gnome-terminal --working-directory=/myDir1/build/ -e './myExecutable1' &
}

function doAnotherThing()
{
    gnome-terminal --working-directory=/myDir2/build/ -e './myExecutable2' &
}

$(startBasics)
$(doOneThing)
$(doAnotherThing)

ただし、startBasics完了すると、他の機能はまったく実行されません。それで、内部にすべて同じ位置に置いてもう一度やり直してstartBasicsみましたが、うまくいくようでした。

それでは、上記のコードはなぜ機能しないのでしょうか?別の関数を書く正しい方法は何ですか?

答え1

あなたの:

$(startBasics)

うまくいかず、問題の原因です。これはコマンドの置換です。出力に展開します(末尾の改行が削除され、引用されていないため、分割+globが適用されます)$(cmd)cmd出力に基づいてコマンドを作成するようにシェルに要求しますstartBasics

startBasicsこれは、シェルがファイルを拡張するためにファイルの最後まで出力を読み取る必要があることを意味します。ここでの拡張はコマンドの実行とみなされるため、ほとんど意味がありません。

コマンド置換を実装するために、シェルはまずstartBasicsstdoutをパイプにリダイレクトし、次にパイプのもう一方の端から読み込みます。すべてのgnome-terminalプロセスはこの標準出力を継承します。

シェルは、書き込み側(すべてのプロセスで)に開いているすべてのファイル記述子が閉じられている場合、パイプのもう一方の端にのみeofを表示できます。これはgnome-terminals、開始されたすべてが終了した場合にのみstartBasics発生する可能性があります。

希望する場所は次のとおりです。

#!/bin/sh -

startBasics() {
    gnome-terminal -e "sth" &
    gnome-terminal --tab -e "sth_else" &
}
doOneThing() {
    gnome-terminal --working-directory=/myDir1/build/ -e './myExecutable1' &
}
doAnoterThing() {
    gnome-terminal --working-directory=/myDir2/build/ -e './myExecutable2' &
}

startBasics
doOneThing
doAnoterThing

wait # if you'd rather wait for all those processes to finish
     # before exiting.

答え2

&バックグラウンドでコマンドを開始します。だから文句を言った

startBasicsが完了した後、他の機能はまったく実行されません。

このような他のプログラムが実行されている現象が原因である可能性があります。そして完了終了する前にstartBasics

さらに、コマンドを$( ... )コマンドで働きます:

startBasics
doOneThing
doAnoterThing

しかし、どういうわけかあなたがしたいことは、次のコマンドを実行するようです。以内にターミナル一つ一つ。この場合は、次のようにします。

gnome-terminal --working-directory=/myDir2/build/ -x /bin/sh -c 'sthe; sthelse; ./myExecutable1; ./myExecutable2'

バラよりhttps://superuser.com/questions/198015/open-gnome-terminal-programmatically-and-execute-commands-after-bashrc-was-execu

関連情報