3

私はシェルを初めて使用します。use (command) が新しいサブシェルを作成し、コマンドを実行することを知ったので、親シェルとサブシェルの pid を出力しようとしました。

#!/bin/bash

echo $$
echo "`echo $$`"
sleep 4
var=$(echo $$;sleep 4)
echo $var

しかし、答えは次のとおりです。

$./test.sh
9098
9098
9098

私の質問は次のとおりです。

  1. なぜ3つのエコープリントだけなのですか? 私のコードには4つのエコーがあります。
  2. なぜ 3 つの pid が同じなのですか? サブシェルの pid は明らかに彼の父親のものと同じではありません。

答えてくれてありがとう:)

4

3 に答える 3

6

まず、割り当ては子の標準出力をキャプチャvarし、それを印刷するのではなく、に入れます。

var=$(echo $$;sleep 4)

これは次のように見ることができます:

$ xyzzy=$(echo hello)
$ echo $xyzzy
hello

次に、これらの$$変数はすべて現在のシェルで評価されます。つまり、子が開始するに現在のPIDに変換されます。子には、すでに生成されているPIDが表示されます。つまり、子はecho 9098ではなく実行していecho $$ます。

子のPIDが必要な場合は、一重引用符を使用するなどして、親での翻訳を防ぐ必要があります。

bash -c 'echo $$'
于 2012-04-05T06:40:30.180 に答える
0
echo "one.sh $$"
echo `eval echo '$$'`

上記が異なるpidを出力することを期待していますが、そうではありません。子プロセスを作成しています。``に sleep を追加して検証済み。

echo "one.sh $$"
echo `eval "echo '$$'";sleep 10`

上記をスクリプトから実行してpsを実行すると、 one.sh(スクリプトの名前) と sleep の 2 つのプロセスが表示されます。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
test    12685  0.0  0.0   8720  1012 pts/15   S+   13:50   0:00      \_ bash one.sh
test    12686  0.0  0.0   8720   604 pts/15   S+   13:50   0:00          \_ bash one.sh
test    12687  0.0  0.0   3804   452 pts/15   S+   13:50   0:00              \_ sleep 10

これは生成された出力です

one.sh 12685
12685

何が欠けているのかわからない。

于 2012-04-05T08:25:40.550 に答える
-1

解決策は$!. 次のように:

#!/bin/bash

echo "parent" $$
yes > /dev/null &
echo "child" $!

出力:

$ ./prueba.sh
parent 30207
child 30209
于 2012-05-30T13:12:35.470 に答える