
例えば、ターミナルをいくつか起動して、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日
No.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
notnot様、ありがとうございます。
サブシェルのpsコマンドの出力がわかりました。
teeコマンドの使い方に感激しました。
2014年8月9日
No.2
- 回答日時:
なんの不思議もありません。
バッククオートや$() でコマンドを実行するときに、 (コマンドラインを入力した)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日
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
CSVファイルの複数行削除
-
今のプログラミング言語
-
プログラミングについて
-
画像生成AIのプロンプトの作り...
-
プログラム言語
-
Python... 環境設定 初心者です...
-
自作scratch アニメの商用利用
-
パイソンのソースコードをChatG...
-
数学、プログラミング、物理、...
-
google Colabでmatplotlibの描...
-
pip --versionがエラーになる
-
pythonの実行に関する質問
-
OS入ってる機器のソフト・アプ...
-
Rでのデータフレーム作成について
-
Google ColaboでGUI作成
-
Python 3.12.2 か一番最新のパ...
-
IT業で開発をされてる方々に質...
-
アセンブリ言語について。
-
Geminiフォーム 画像生成で 人...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語
-
vba クリップボードクリアにつ...
-
プログラミングについて
-
画像生成AIのプロンプトの作り...
-
自作scratch アニメの商用利用
-
今のプログラミング言語
-
CSVファイルの複数行削除
-
Python... 環境設定 初心者です...
-
Python 3.12.2 か一番最新のパ...
-
数学、プログラミング、物理、...
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
pip --versionがエラーになる
-
Geminiフォーム 画像生成で 人...
-
OS入ってる機器のソフト・アプ...
-
Google ColaboでGUI作成
-
google Colabでmatplotlibの描...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
VBAでパワーシェルを実行したい...
おすすめ情報