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