コマンド置換を使用した場合に、シェル自体が子プロセスとして立ち上がる場合とそうでない場合があります。
具体的には以下のような場合です。
【パターン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で質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 環境学・エコロジー 二酸化炭素の排出 1 2023/08/07 16:40
- その他(プログラミング・Web制作) ログインシェル時のSHELL環境変数 1 2022/06/08 19:21
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- 日本株 SBI証券HYPER SBI 2のエラー 1 2023/01/31 13:38
- PHP PHP・Wordpress preg_replaceを条件分岐で処理させる方法が知りたい 1 2023/05/01 14:25
- その他(開発・運用・管理) bashで15分前と現在のエポックタイムの時間を取得したい 2 2023/02/01 19:10
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- 政治 私は文部科学省ヘ入り込んで投稿した私の建議文を彼らが私の依頼まましましょうか。? 2 2023/08/22 07:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ終了時にDOS窓を閉じるコ...
-
バッチファイル 文字列にスペ...
-
コマンドプロンプトをクリック...
-
ショートカットをデスクトップ...
-
make test って何をするための...
-
バッチファイルでディスク容量...
-
AccessVBAで実行時間を指定する...
-
バッチコマンドのIF文(条件...
-
SSH接続でwindowsサーバのコマ...
-
ftpコマンドを実行すると「425 ...
-
Windowsのバッチ(bat)ファイル...
-
コマンドプロンプトでファイル...
-
コードからアクセス権限の変更
-
FTPの連続実行でフリーズする
-
findstrでヒットした1行前の文...
-
コンピュータ名をファイル名に...
-
シェルの「:コマンドが見つか...
-
コマンドプロンプトで、特定の...
-
if [ 条件式 ]とif[[ 条件式 ]]
-
DOSコマンドで指定日数よりも過...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 文字列にスペ...
-
バッチ終了時にDOS窓を閉じるコ...
-
コマンドプロンプトをクリック...
-
make test って何をするための...
-
ftpコマンドを実行すると「425 ...
-
ショートカットをデスクトップ...
-
コマンドプロンプトで、特定の...
-
バッチファイルを使ってテキス...
-
シェルの「:コマンドが見つか...
-
findstrでヒットした1行前の文...
-
コンピュータ名をファイル名に...
-
AccessVBAで実行時間を指定する...
-
コマンドプロンプトでファイル...
-
2つ目の「pause」は無効?
-
コマンドプロンプトのバッチで...
-
バッチファイルでdiskpart.exe...
-
ftpコマンド出力結果の取得
-
コマンドプロンプトのERRORLEVE...
-
バッチコマンドのIF文(条件...
-
コマンドプロンプト
おすすめ情報