
コマンド置換を使用した場合に、シェル自体が子プロセスとして立ち上がる場合とそうでない場合があります。
具体的には以下のような場合です。
【パターン1】
コマンド置換内の処理が1行の場合は子プロセスが発生しない
abc=`pstree`
echo $abc
-sshd-+-sshd---bash---pstree
(該当部分だけを切り出しています)
【パターン2】
コマンド置換内で処理が2行以上ある場合は子プロセスが発生する
abc=`echo; pstree`
echo $abc
-sshd-+-sshd---bash---bash---pstree
(該当部分だけを切り出しています)
パイプを使用した場合には子プロセスとして処理が実行されることは認識しているのですが、コマンド置換の場合も子プロセスとして実行されるのが普通なのでしょうか?
だとすれば、パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか?
このあたりに詳しい方、ご教示いただければ幸いです。
No.1ベストアンサー
- 回答日時:
単純に fork + execve で実行できる物と、そうでないものの違いでしょう。
>パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか?
オーバーヘッドを減らすための最適化です。
リダイレクトを使っても子bashが起動されます。
ご回答ありがとうございます。
fork + execveで実行できないものとはどのようなものでしょうか?
子プロセスは基本的にfork + execveの組み合わせで実行するものと認識しています。
>オーバーヘッドを減らすための最適化です。
間にサブシェルが立ち上がらないのは最適化のため、ということで理解できました。
No.3
- 回答日時:
No1です。
>fork + execveで実行できないものとはどのようなものでしょうか?
誤解を招いたようですね。
>単純に 「fork + execve で実行できる物と、そうでないもの」の違いでしょう。
ではなく、
>「単純に fork + execve で実行できる物」と、「そうでないもの」の違いでしょう。
です。
単純なというのは、「各種置換を行った後の文字列を、単語に切り分けて、forkしてexecveを呼ぶ」という意味で使いました。
「そうでないもの」というのは、リダイレクト処理が必要な物、単一コマンドで無く複合コマンドや、リストやパイプな物、その他シェルの機能(一部)を使う物など。
回答の文章を少し勘違いをして読み違えていたようです。
単純に実行可能なものと、パイプなどを伴う複雑なものという意味だったのですね。
No.2
- 回答日時:
子プロセスと、子シェルを混同してませんか?
単コマンドでは、そのコマンドだけ実行すればいいので、子プロセスとしてそのコマンドを実行する。子シェルは実行する必要がない。
複合コマンドでは、その制御のために子プロセスとしてシェルを実行してその中でコマンドを実行します
ご回答ありがとうございます。
子シェルも一つのプロセスなので、子プロセスであると言えると思います。
混同しているわけではないのですが、子シェルが立ち上がる場合と、そうでない場合の違いが分からなかったので質問させて頂きました。
単一コマンドの場合は無駄な子シェルが実行される必要がないために、直接子プロセスとしてコマンドが実行されるということで理解できました。
No.1の方がご回答下さったように「最適化」ということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 文字列にスペ...
-
make test って何をするための...
-
VisioのVBAでユーザにファイル...
-
バッチファイルを使ってテキス...
-
ダブルクォーテーションのファ...
-
ftpコマンドを実行すると「425 ...
-
コンピュータ名をファイル名に...
-
コマンドプロンプトをクリック...
-
コマンドプロンプトで、特定の...
-
WSHで他のバッチを呼びその終了...
-
【LINUX】sudoコマンドについて
-
DOSコマンドに詳しい方、お知恵...
-
VB6.0 から RFIDタグを制御す...
-
シェルの「:コマンドが見つか...
-
シェルからpsqlコマンドでトラ...
-
バッチファイル
-
バッチコマンドのIF文(条件...
-
シェルスクリプト内のcdで、カ...
-
xCopyコマンドでネットワークご...
-
AccessVBAで実行時間を指定する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 文字列にスペ...
-
コマンドプロンプトをクリック...
-
バッチ終了時にDOS窓を閉じるコ...
-
make test って何をするための...
-
ftpコマンドを実行すると「425 ...
-
シェルの「:コマンドが見つか...
-
バッチファイルを使ってテキス...
-
コンピュータ名をファイル名に...
-
DOSコマンドに詳しい方、お知恵...
-
xCopyコマンドでネットワークご...
-
AccessVBAで実行時間を指定する...
-
findstrでヒットした1行前の文...
-
ftpコマンド出力結果の取得
-
シェルスクリプト(.sh)で、10進...
-
バッチえファイルを編集するに...
-
VBA 特定文字含むファイル
-
VisioのVBAでユーザにファイル...
-
複数のフォルダを開くバッチフ...
-
コマンドプロンプトでファイル...
-
シェルスクリプト内のcdで、カ...
おすすめ情報