これが私が達成したいものです。
#!/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
これは、シェルがファイルを拡張するためにファイルの最後まで出力を読み取る必要があることを意味します。ここでの拡張はコマンドの実行とみなされるため、ほとんど意味がありません。
コマンド置換を実装するために、シェルはまずstartBasics
stdoutをパイプにリダイレクトし、次にパイプのもう一方の端から読み込みます。すべての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'