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を加味した作りになったのであった。罪深い。ほんとすいません。