
私は長年 GNU/Linux ユーザーですが、Mac で使用可能なプロセス情報を取得する方法がわかりません。
Mac OS (Snow Leopard) のログイン シェルで$0
解決されることに気付きました。-bash
これにより、Linux環境では正常に動作する特定のシェルスクリプトが動作しなくなる可能性があります。*.
残念ながら、マニュアルページにはこの事実は記載されていない。
bash がコマンドのファイルで起動された場合、$0 はそのファイルの名前に設定されます。bash が -c オプションで起動された場合、$0 は実行される文字列の後の最初の引数 (存在する場合) に設定されます。それ以外の場合は、引数 0 で指定された、bash の起動に使用されたファイル名に設定されます。
マイナス記号には特別な意味がありますか?/proc
関連する実行可能ファイルを見つけるのに役立つようなものやコマンドライン ツールはありますか?
* バカな私。もちろん、$0はマニュアルに記載されているようにスクリプト名として評価されます。
答え1
マイナス記号は、システムがシェルにログイン シェルとして呼び出され、ソースする必要があることを伝える方法です~/.profile
(Bourne 互換シェルの場合)。これは、Linux、OSX、およびその他のすべての Unix に当てはまります。スクリプトはログイン シェルでは実行されません。スクリプトの場合、$0
はスクリプト ファイルの名前です (フル パスの有無は問いません)。
追加した: マニュアルページには、さまざまなケース(ほぼすべて)が説明されています。
「bash がコマンドのファイルで呼び出されると、$0 はそのファイルの名前に設定されます。」これは、 で実行されるスクリプトだけで
bash myscript
なく、スクリプトが直接実行され で始まる間接的なケースも対象とします#!/bin/bash
。「bash が -c オプションで起動された場合、$0 は実行される文字列の後の最初の引数(存在する場合)に設定されます。」 の場合
-c
、$0
は呼び出し元が明示的に示すものに設定されます。「それ以外の場合は、引数 0 で指定された、bash を呼び出すために使用されるファイル名に設定されます。」ログイン シェルはこれに該当します。シェルは引数 0 以外の引数なしで呼び出されるため、
$0
引数 0 に設定されます。シェルに渡す引数を選択するのは、、、またはログインを処理するプログラムでありlogin
、su
引数-
0 の前に を付加して、シェルにログイン シェルであることを伝えます。
おそらく、引数 0 についての説明が必要でしょう。プログラムが実行されると、最終的にはexecve
システム コールが行われます。そのシステム コールには 3 つの引数が必要です。
ファイル名。既存の実行可能ファイルを指定する必要がある。カーネルはこのファイルを読み込み、実行をそのファイルに転送します。
文字列の配列、引数と呼ばれる。この配列の要素0は慣例により上記と同じファイル名、または実行可能ファイルの場所が環境変数の検索によって決定された場合は、完全パスなしのファイル名のみ
$PATH
。ログイン シェルなど、この規則には例外があります。環境と呼ばれる別の文字列配列。
と入力してシェルからプログラムを呼び出す場合myprogram foo bar
、 の引数は次のようにexecve
なります。1
. /usr/bin/myprogram
(ここがシェルが を見つけた場所であると想定myprogram
)
2. myprogram
、foo
、bar
3. エクスポートされたシェル変数ごとに、変数名の後に等号と値が続きます。
execve
実行中のプログラムから渡された実行可能ファイルの名前を見つける一般的な方法はありません。Linux では、通常、 として利用できます/proc/$$/exe
。 は$$
プロセス ID です。すべての UNIX で が利用できますps
が、 の内部動作はps
大きく異なります。プログラムの実行中に実行可能ファイルが削除されたり、名前が変更されたりすることがあります。この場合、ps
古い情報が報告されるか、情報が報告されないことがあります。
答え2
からman bash
:
exec [-cl] [-a name] [command [arguments]]
command が指定されている場合は、シェルが置き換えられます。新しいプロセスは作成されません。arguments は command の引数になります。-l オプションが指定されている場合は、シェルは command に渡される 0 番目の引数の先頭にダッシュを配置します。これは login(1) が行うことです。...
答え3
-bash で何が起こっているのかはわかりませんが、シェルで bash を再度実行すると、 $0 の値は問題ないように見えます。
これは OS X が特別な処理を行っているようです。ターミナル プログラムで使用されるデフォルトのスクリプトである /usr/bin/login を実行すると、$0 で同じ問題が発生します。