ps –axとはどういう意味ですか? grep $$ > catchは何をしますか?

ps –axとはどういう意味ですか? grep $$ > catchは何をしますか?

ps –ax | grep $$ > catch効果は何ですか?この行の機能が何であるかを知りたいです。コードを実行すると、出力に何も追加されません。

答え1

このコマンドは、ps -ax あなたのプロセスと他のユーザーのプロセスを表示します。

grep正規表現に一致する行を一致させます。この場合、正規表現はであり $$、シェルは現在のシェルのプロセスIDに展開されます。

右山かっこ(>)は出力を名前付きファイルにリダイレクトしますcatch。ファイルが存在する場合は、最初に切り捨てられ(空になり)、そうでなければファイルが生成されます。

答え2

これは良い方法ではありません。 psに以下を表示するように依頼しました。

  • すべてのプロセス(デフォルト)
  • プラス - ttyを持つ他のすべてのプロセス(オプション)
  • プラス - ttyを持たない他のすべてのプロセス(xオプション)
  • grep次に、ステップ1の単一プロセスを使用してフィルタリングします。

簡単なことがps -h $$ > catch可能です。ps興味のあるプロセスのPIDをコマンドラインオプションとしてインポートするので、何が必要なのかを知っている場合は、grepが機能しないように直接指定してください。オプション-hはヘッダー行を削除することです。

しかし、スクリプトでは、$$は「このシェル」を意味するので、非常に注意する必要があります。これ通話時間と場所によって異なります。

次の 2 つのコマンドを検討してください。

$ sh -c "ps -ax | grep $$"
   3802 pts/0    Ss     0:11 bash
3658110 pts/0    S+     0:00 sh -c ps -ax | grep 3802
3658112 pts/0    S+     0:00 grep 3802
$ sh -c 'ps -ax | grep $$'
3658142 pts/0    S+     0:00 sh -c ps -ax | grep $$
3658144 pts/0    S+     0:00 grep 3658142

スクリプトは常にこの種のことをします。最初の行は3行ですが、2行目は2行しかありませんか?その理由は、最初の問題は私たちが解決し、スクリプトを実行して$$「デフォルト」シェルを見つけることですが、2番目の問題は別の方法で実行しているからです。もちろん、サブシェルに対して異なるPIDがあり、一致しないためです。 3802親。

どちらが正しいですか?それはあなたがしたいことに依存します。メインシェルを探している場合、通常は最初に変数に設定するので、それが私が望むことは明らかです。

関連情報