プロが教える店舗&オフィスのセキュリティ対策術

コマンド置換を使用した場合に、シェル自体が子プロセスとして立ち上がる場合とそうでない場合があります。
具体的には以下のような場合です。

【パターン1】
コマンド置換内の処理が1行の場合は子プロセスが発生しない
abc=`pstree`
echo $abc

-sshd-+-sshd---bash---pstree
(該当部分だけを切り出しています)

【パターン2】
コマンド置換内で処理が2行以上ある場合は子プロセスが発生する
abc=`echo; pstree`
echo $abc

-sshd-+-sshd---bash---bash---pstree
(該当部分だけを切り出しています)


パイプを使用した場合には子プロセスとして処理が実行されることは認識しているのですが、コマンド置換の場合も子プロセスとして実行されるのが普通なのでしょうか?
だとすれば、パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか?

このあたりに詳しい方、ご教示いただければ幸いです。

A 回答 (3件)

単純に fork + execve で実行できる物と、そうでないものの違いでしょう。



>パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか?
オーバーヘッドを減らすための最適化です。
リダイレクトを使っても子bashが起動されます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

fork + execveで実行できないものとはどのようなものでしょうか?
子プロセスは基本的にfork + execveの組み合わせで実行するものと認識しています。

>オーバーヘッドを減らすための最適化です。
間にサブシェルが立ち上がらないのは最適化のため、ということで理解できました。

お礼日時:2013/03/31 11:32

No1です。


>fork + execveで実行できないものとはどのようなものでしょうか?

誤解を招いたようですね。

>単純に 「fork + execve で実行できる物と、そうでないもの」の違いでしょう。
ではなく、
>「単純に fork + execve で実行できる物」と、「そうでないもの」の違いでしょう。
です。

単純なというのは、「各種置換を行った後の文字列を、単語に切り分けて、forkしてexecveを呼ぶ」という意味で使いました。
「そうでないもの」というのは、リダイレクト処理が必要な物、単一コマンドで無く複合コマンドや、リストやパイプな物、その他シェルの機能(一部)を使う物など。
    • good
    • 0
この回答へのお礼

回答の文章を少し勘違いをして読み違えていたようです。
単純に実行可能なものと、パイプなどを伴う複雑なものという意味だったのですね。

お礼日時:2013/04/01 12:51

子プロセスと、子シェルを混同してませんか?



単コマンドでは、そのコマンドだけ実行すればいいので、子プロセスとしてそのコマンドを実行する。子シェルは実行する必要がない。
複合コマンドでは、その制御のために子プロセスとしてシェルを実行してその中でコマンドを実行します
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

子シェルも一つのプロセスなので、子プロセスであると言えると思います。
混同しているわけではないのですが、子シェルが立ち上がる場合と、そうでない場合の違いが分からなかったので質問させて頂きました。

単一コマンドの場合は無駄な子シェルが実行される必要がないために、直接子プロセスとしてコマンドが実行されるということで理解できました。
No.1の方がご回答下さったように「最適化」ということですね。

お礼日時:2013/03/31 11:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!