例えば、ターミナルをいくつか起動して、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で質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- UNIX・Linux bashスクリプトのgrepで3XXの検索の仕方について 2 2022/09/06 21:35
- その他(プログラミング・Web制作) ログインシェル時のSHELL環境変数 1 2022/06/08 19:21
- UNIX・Linux Linuxについて2つ質問したいです。 ① シェルスクリプト名をawk1.shとして、指定されたデー 1 2023/02/03 03:49
- その他(プログラミング・Web制作) linuxについて質問です 1 2023/02/06 19:55
- その他(プログラミング・Web制作) Linuxについて質問です。 引数に指定されたアクセスログのファイルからアクセス数が多い順に上位3つ 1 2023/02/03 03:46
- UNIX・Linux Linuxについて質問です。 シェルスクリプト名をfind.shとして、以下の条件をすべて満たすファ 1 2023/02/03 03:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
小学1年生の子です。塾に行かせ...
-
楽しくて最高のプログラミング...
-
ラズパイpico PIOモード
-
Pythonでgif画像が上手く作れない
-
pythonで複数画像からgifを作る...
-
プログラミング
-
vba クリップボードクリアにつ...
-
RTKPOSTのファイル生成について
-
プログラミング ソースコード
-
正規表現で複数マッチ条件で悩...
-
windowsでテキストファイルの各...
-
スカラーのベクトル微分
-
Pythonって何を意識した言語な...
-
Selenium4でボタンをクリックで...
-
ExcelVBAでFormulaR1C1を列範囲...
-
HTMLソースが表示のページのも...
-
シェルのSTEP数について教えて...
-
Google ColaboでGUI作成
-
ものづくりに向いているプログ...
-
https://paiza.jp/challenges/5...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
chatGPTで次々と質問をしていく...
-
昔のパソコン少年の武勇伝「店...
-
スカラーのベクトル微分
-
ハッシュテーブル(連想配列)が...
-
最新のプログラム言語を学ぶに...
-
pythonにてseleniumを使うも、...
-
Windowsのアプリ開発ってなんの...
-
vba クリップボードクリアにつ...
-
Google ColaboでGUI作成
-
sublimit textっていうエディタ...
-
フリーランスのエンジニアって...
-
ExcelVBAでFormulaR1C1を列範囲...
-
matplotlibで任意の角度の円弧...
-
そのまま使っただけなのに・・...
-
家庭のパソコンで Python の 環...
-
初心者powershellのPS1ファイル...
-
Webプログラムってネイティブア...
-
httpリクエストの送り元の特定
-
プログラミングで例えばゲーム...
-
rpa化する言語としてら何があり...
おすすめ情報