Ubuntuのコマンドマニュアルにはps
次のテキストがあります。
このpsバージョンはさまざまなオプションを受け入れます:
1 UNIX options, which may be grouped and must be preceded by a dash. 2 BSD options, which may be grouped and must not be used with a dash. 3 GNU long options, which are preceded by two dashes.
Ubuntuの組み込みコマンドが他のオペレーティングシステムのオプションを使用できるのはなぜですか? Linux、UNIX、BSDは起源は同じですが、枝が異なることを知っています。
答え1
これはすべてAlbert D. Cahalanという人のために起こりました。 XeはBSDを理解していません。
ps
もともとLinuxコマンドは次のように書かれていました。ブランコ・ランケスター(Branko Lankester) 1992年3月初版出版。後で「proc-ps」と区別するために「kmem-ps」と呼ばれた。1992年12月 Michael K. Johnson 出版。 M. Lankesterはps
このkmem
デバイスを使用してカーネルメモリからプロセステーブルを読み込みます。 M. Johnsonはファイルシステムをps
使用してproc
プロセステーブルを読み込み、今後数年間にわたっていくつかのバージョンがリリースされました(例:1993年1月、1994年1月)。
当時も、これらのコマンドは1980年代初頭ps
スタイルのかなり古いコマンド構文を提供しました。getopt()
これはから来たものですkmem-psは1993年11月にリリースされました。:
使用法: ps 0acefhHjlmnprsStuUvwxXy [t tty] [pid[,pid]...] j - ジョブ制御形式、l - 長い形式、m - メモリ形式、 s - 信号形式、u - ユーザー形式、v - 仮想メモリ形式、 X - レジスタフォーマット、y - システムコールフォーマット、デフォルト値 - ショートフォーマット 0 - タスク0を含み、a - すべてのユーザーのプロセスを含みます。 c - コマンド名のみ印刷、e - 環境変数の表示、f - プロセスフォレストの印刷 h - ヘッダーを抑制します。 n - ユーザーフィールドとwchanフィールドを数値で印刷します。 p - ページ数を印刷します。 r - 実行可能なプロセスにリストを制限します。 S - CPU時間とページエラーフィールドのサブプロセス使用量を要約します。 t tty - TTY を制御端末として使用するすべてのプロセスを表示します。 w - 幅:132、ww - 264、www - 無制限、デフォルト - 画面幅または80 x - 制御端末がないプロセスを含みます。 U[SYSTEM-PATH[SWAP-PATH]] - ps データベースの更新
ご覧のとおり、文字には個性があり、単一の意味があり、前にマイナス文字はありません。
U
ロゴ(お知らせではありません)のアイデアは-U
次のとおりです。1986年のBSDパッチps
Michael A. CallahanはこれをUsenet mod.sources
News Group(第6巻、第83号)に掲示しました。
数年後、Albert D. Cahalanが登場し、proc-psを書き直しました。 Xeはこれについて多くの主張をしています。残念なことに、これらの主張の多くは真実ではないという事実は忘れられており、ps
数年後もまだ存在するマニュアルでは、ps
Unix、BSD、およびGNUオプションの構文を提供すると主張しています。
そうではありません。
BSDはオプション処理をps
使用します。getopt()
Marc Teitelbaumが1990年4月に変更した後、年度ps
M. Cahalanのバージョンは言うまでもなく、M. LankesterのLinuxバージョンよりはるかに古いです。
M. Cahalanはps
以前のLinux kmem-ps / proc-ps構文を提供しました。後で、ps
M. CahalanがAIXコマンドから出たと主張するいくつかの構文を追加しました。ユーズネットでこの点をしっかりと明らかにしたM. Cahalan:「BSDは不便ですが、SysVはそうではありません」それFreeBSDは「迷惑」proc-psのxyr書き換えは次のとおりです。「標準準拠/bin/ps
」、「旧BSD構文」のサポート皮肉なことに、これが実際にはほぼ10年間BSD構文ではなかったという事実は、当時認識されていませんでした。 ps
それ自体ただそこにいたしかもその年に標準化されました。 標準原理分析BSDとAT&T Unixコマンドラインオプションの比較は、M. Cahalanの記事のどれよりもはるかに思慮深いです。
これはps
有名なI_WANT_A_BROKEN_PS
環境変数を紹介しますが、混乱するように、M. Cahalanはxyrselfがオプションの解決を担当していると主張しながらM. Johnsonのプロパティを指定します。実際、twainは2つのps
実装を並列に保ちます。。
奇妙なことに、当時のBSDの場合getopt()
と同様に、マイナス記号の前に-styleオプションを使用し(当時)、新しい記録標準としてCahalan / Johnsonは次のように指摘しています。ps
ps
ps
警告: '-'は廃止されました。 「ps -e」の代わりに「ps e」を使用してください。
実はもともとそうでした。いいえ廃止され-
ました。実際、M. Cahalanはxyrがps
標準的な方法で動作すると主張しています - BSDがすでにやっている-
ようです。ps
これにより、1990年代後半と2000年代初めに混乱していた多くのユーザーから質問が提起され、本で次の内容が言及され始めると、通常システム管理者とユーザーも混乱していました。
なぜシンボルの前にダッシュを使用しないのか疑問に思います——Deborah S. RayおよびEric J. Ray(1998)。Unixシステム。ピッチスキンプレス。 ISBN 9780201353952。 174.ps
。使用できますが、これはps
古い方法なので、プログラムを引き続き使用すると警告メッセージが表示されます。
この議論を引き続き見ることができます。oldps
手動これは、「BSDバージョンから派生したps
」について説明します。これは本当ではありませんが、Linuxバージョンから派生したものであることは明らかです。コマンドライン引数の前には「-」文字を入れてはいけません。現在のコマンドライン引数の「拡張BSD」スタイルを表すために「-」を使用する代わりに、Unix98標準のコマンドライン引数を表すために使用します。
これらのいくつかはprocps-ngで軽減されました。第三書き換えは、世紀が変わるやいなや(プロジェクト名の「-ng」がà laモードであったとき)行われたが、この時、Cahalan / Johnsonがps
。oldps
ご覧のとおり、マニュアルps
には「拡張」と表示されなくなります。しかし、新しいバージョンps
(それでもM. Cahalanが関係しています。)実際には、いくつかの人格の全体的なアイデアを非常に受け入れます。残念ながら他にもまだこれにより、今日まで続くBSDコマンドラインオプションに関する噂が続きました。
同時に、幸せ一つ-personality BSDは、この回答を書いた時点で、ps
過去29年7日間にコマンドラインオプションを提供しました。getopt()
NetBSDprocstat
とOpenBSDは、単一のUnix仕様が維持するps
新しい妥協オプションを追跡しました。-A
新しいBSD-O
オプションps
。
追加読書
答え2
一般的な答えだけを提供できます。コマンドラインオプションは通常、ライブラリ関数を使用して解析されますgetopt
。最初は - の後に記号が続く引数だけが許可されます。これは、-A から -Z、-a から -z、-0 から -9 まで使用可能なオプションの数を効果的に制限します。実際の使用に関する最小限のヒントがなくても、ヘルプの場合は-h、バージョン情報、または詳細な出力の場合は-vなどのオプションを使用しないと想像できます。
Linuxにはしばしば標準Cライブラリglibcと関連があり、同様のオプションを処理するgetopt拡張機能があります。その結果、GNUによって開発された多くのコマンド(glibcなど)はこの拡張を使用します。多くのコマンドでGNUに似たスタイルオプションを使用することもできます。 -vと--verbose、-h、--helpなど。 BSDでも同じことが起こるようです(私はBSDの専門家ではありませんが訂正してください)。
あなたのps
コマンドはprocpsと呼ばれるソフトウェアのコレクションから来ます。推測する彼らは特定のプラットフォームのオプションスタイルを模倣したいと思います。したがって、UNIXユーザーの場合は - オプションがあります。 BSDの場合、このような内容も許可されますps aux
。
ps
このように動作する唯一のプログラムではありません。多くの標準プログラムは、「以前の」UNIXバージョン(POSIX)といくつかの最新の拡張機能をサポートしています。