アプリ版:「スタンプのみでお礼する」機能のリリースについて

例えば、ターミナルをいくつか起動して、bashが動いている数を調べるのに、
$ cnt=`ps ax | grep 'bash' | grep -v -c 'grep'`
$ echo $cnt
とすると、あるべき数より1つ多い数値がcntに入っています。
$ ps ax | grep 'bash' | grep -v -c 'grep'
で出力される数に1を足した数値です。

一方、lessをいくつか起動して、上記の'bash'を'less'に代えると正しい数値が返ります。

上記の'bash'を自作シェルスクリプト'mycmd'に代えると、cntにはあるべき数より1つ多い数値が入ります。

間違った操作をしているのかもしれませんが、これはどういう事情によるものでしょうか。
2014年8月7日

A 回答 (3件)

>の場合、grepが検索しているのは'bash'ではなく'test.sh'ですが、サブシェルを表すpsコマンドの出力に'test.sh'という文字列が含まれているのでしょうか。



そうですね。含まれています。

パイプを流れる文字列を途中で見てみましょう。
cmd=`basename $0`
cnt=`ps ax | grep $cmd | tee /dev/tty | grep -v -c grep`
echo $cnt
のようにしてみてください。grep $cmd の結果が、端末(/dev/tty)に表示されます。
あるいは、grep 前の ps の出力を見た方が良いかもしれない。
cnt=`ps axf | tee /dev/tty | grep $cmd | grep -v -c grep`
とか。

サブシェルを使わなければ、数は増えません。
cmd=`basename $0`
ps axf | tee /dev/tty | grep $cmd | grep -v -c grep > /tmp/1
read cnt < /tmp/1
echo $cnt
    • good
    • 0
この回答へのお礼

notnot様、ありがとうございます。
サブシェルのpsコマンドの出力がわかりました。
teeコマンドの使い方に感激しました。
2014年8月9日

お礼日時:2014/08/09 05:18

なんの不思議もありません。



バッククオートや$() でコマンドを実行するときに、 (コマンドラインを入力した)bashを親とした子プロセスが作られ、そこで実行します。
その時に、 パイプラインを使った場合等では、その処理のために、シェルが実行されます(サブシェルと言ったりします)

cnt=`ps ax | grep 'bash' | grep -v -c 'grep'`
だと、このコマンドラインを入力したbashを親として
bash -c "ps ax | grep 'bash' | grep -v -c 'grep'"
が実行されます。このbashは、コマンドライン入力したbashとは別のプロセスです。


スクリプトを実行するときも同じです。
test.sh
等と実行したとき、test.shの中身を実行するのは、コマンドライン入力した親のbashではなく、そこから呼び出された子のbashです。

この点は、スクリプト初心者が陥りやすい罠になっています。
環境設定用に

#env.sh
export TEST_PATH=/foo/bar

というスクリプトを作ったとします。
これを使おうと、
env.sh
と実行しても、 export~が実行されるのは、子シェルです。環境変数は、親→子には引き継がれますが、逆には対応できません。
親シェルの方は、この設定が実行前のままになります。

親シェルで実行するには、 sourceを使う必要があります。

このあたりは、Windowsのバッチファイルとは違うので注意しましょう。

この回答への補足

kmee様、丁寧な回答をありがとうございます。
理解力がなくてなさけないですが、
$ cat test.sh
  cmd=`basename $0`
  cnt=`ps ax | grep $cmd | grep -v -c 'grep'`
  echo $cnt
の場合、grepが検索しているのは'bash'ではなく'test.sh'ですが、サブシェルを表すpsコマンドの出力に'test.sh'という文字列が含まれているのでしょうか。
2014年8月8日

補足日時:2014/08/08 22:37
    • good
    • 0

バッククオートで「サブシェル」を起動してるからでは?

この回答への補足

kmee様、ありがとうございます。
自作のスクリプトを走らせて検索した場合も1つ多い数となるのが不思議です。この場合はlessと同じように正しい数が返ってくると思うのですが。
2014年8月8日

補足日時:2014/08/08 07:29
    • good
    • 0

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