私の場合は、bashおよび/またはzshでシェルを起動するときにプログラムがすでに実行されていることを確認するために、.zshrcおよび/または.bashrcに任意の行を追加する必要があります。プログラムがまだ実行されていない場合は起動します。それ?
例:新しいzshシェルを起動しています。 topがまだ実行されていない場合は、topを起動してシェルを引き継ぐようにしたいと思います。 topがすでに別のウィンドウで実行されている場合は、.zshrcが読み込まれ続け、開いている端末を提供したいと思います。
6-16アップデート:
if ! pgrep -U $USER top >/dev/null; then
exec top
fi
上記のスクリプトは私の要件を満たしています。 -q フラグは私のシステムのオプションではないため、機能しません。そのため、PIDを/dev/nullにパイプする必要があります。ありがとう、Mveroone, Kusalananda, Thomas Dickey.
元の質問の範囲を超える機能があります。シングルユーザーシステムを使用していると仮定すると、パスワードを入力しなくてもルートになります。必要に応じてrootとして自動的にtopを実行するにはどうすればよいですか?
6-18 良いです。ルートにコマンドを渡すときに発生する機能クリープの問題を修正しました。複数発射に使った
すべての思いやりのある回答に感謝します。
ベストアンサー1
pgrep
次のように使用してください。
if ! pgrep -u $USER top >/dev/null 2>&1; then
exec top
fi
説明する:
pgrep
コマンドが実行中であることが確認されると、ユーティリティはゼロ終了コードで終了します。したがって、テストは拒否されます。-u $USER
何らかの理由で他の人のプロセスをインポートしないように現在のユーザーに制限することもできます。$USER
標準シェル変数です。何らかの理由で定義されていない場合は試してみ$LOGNAME
て$( id -n -u )
ください。$LOGNAME
返品標準シェル変数)。- 出力は不要なので、
pgrep
標準出力とエラーストリームにリダイレクトします/dev/null
。
top
(またはそうでない場合)実行中であることが見つからない場合は、OPexec
の質問に従ってシェルを置き換えます。
これは互換性のあるすべてのシェルで機能しますsh
。
編集:pgrep
BSDシステム(OS X、OpenBSDなど)の実装には-q
出力を削除するオプションがありますが、pgrep
このフラグはLinuxでは利用できないようです。 BSDシステムでは、少し見苦しいリダイレクトの代わりにこれを使用してください/dev/null
。