%20%E3%81%99%E3%81%A7%E3%81%AB%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%20%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
説明のために Firefox を使用していますが、他のアプリケーションでも同様の問題が発生します。スクリプトは次のとおりです。
$ cat ff.sh
#!/bin/sh
firefox http://superuser.com/
echo "$?"
Firefoxが閉じている状態で、
$ ./ff.sh
Firefox を閉じるまでスクリプトはブロックされます。閉じた後にのみ終了コードが表示されます。
0
$
ここで、Firefox がすでに実行されているとします。スクリプトを実行すると、新しい Firefox タブが開き、最後まで実行されます。(そして、Firefox は実行し続けます。)
$ ./ff.sh
0
$
開始条件に関係なく、最初の例と同じ動作を実現するにはどうすればよいでしょうか。基本的には、
$ cmd &
答え1
非同期で実行されたように見えますが、実際はそうではありません。Firefox
が起動すると、既存のインスタンスがあるかどうかが確認され、見つかった場合は既存のインスタンスに制御が委任され、それ自体が終了します。そのため、混乱が生じます。