かきすて

正しいかどうかよくわからない知識をよくわからないままとりあえず公開してみようというコンセプトで運営しています。

bashスクリプトで自分と同じ名前のプロセス数を数えようとしたら1つ多く表示される、変数に結果を入れようとしたときだけ

雑に排他を実装しようとしたのだが。

zatsu_check.sh

#!/bin/bash
echo '1. 普通に「ps -ef | grep $0 | grep -v grep」を実行した場合'
ps -ef | grep $0 | grep -v grep
echo

echo '2. 「$(ps -ef | grep $0 | grep -v grep)」の場合'
PROCESS1=$(ps -ef | grep $0 | grep -v grep)
cat <<EOT
$PROCESS1
EOT
echo

echo '3. 「`ps -ef | grep $0 | grep -v grep`'」の場合
PROCESS2=`ps -ef | grep $0 | grep -v grep`
cat <<EOT
$PROCESS2
EOT

このように結果を変数に入れようとすると、結果が1行増えてしまう。以下の2番と3番。

$ sh zatsu_check.sh
    1. 普通に「ps -ef | grep $0 | grep -v grep」を実行した場合
    user     69679   9435  0 18:31 pts/3    00:00:00 sh zatsu_check.sh

    2. 「$(ps -ef | grep $0 | grep -v grep)」の場合
    user     69679   9435  0 18:31 pts/3    00:00:00 sh zatsu_check.sh
    user     69707  69679  0 18:31 pts/3    00:00:00 sh zatsu_check.sh

    3. 「`ps -ef | grep $0 | grep -v grep`」の場合
    user     69679   9435  0 18:31 pts/3    00:00:00 sh zatsu_check.sh
    user     69712  69679  0 18:31 pts/3    00:00:00 sh zatsu_check.sh

要するに$()もしくは``でサブシェルが実行され、そのプロセス名が親シェルと同じになるらしい。 なので、真面目に排他を実装しよう、 とはならず、+1を加味した作りになったのであった。罪深い。ほんとすいません。

参考

https://teratail.com/questions/65510

http://tetsuyai.hatenablog.com/entry/20110720/1311131803