各プロンプトの前に、現在のシェルでコマンドを実行します。

各プロンプトの前に、現在のシェルでコマンドを実行します。

jobs私の端末のタイトルに現在のステータスが表示されます。 Bashではこれを使用できますPROMPT_COMMAND。 Korn Shell(ksh93)にはこの機能はありません。

その他の回答内部的にコマンド置換を使用することをお勧めします$PS1。これは通常うまく機能しますが、コマンドでは機能しませんjobs。ここで問題はjobs職業についての人々の心配です。現在のシェルしかし、コマンドの置き換え(例PS1='...$(jobs)...':)サブシェルだから、仕事の機会はありません。

私が知っている唯一のメカニズムですが、trap '... jobs ...' DEBUGこれはあまりにも頻繁に行われます。現在、シェルのコンテキストでプロンプトごとに1回コマンドを実行する方法を知っていますか?それともKornシェルではこれは不可能ですか? !

答え1

デフォルトで設定したばかりの場合は、設定時にPS1="...."引用符内の内容が評価されます。

ただし、中に含めると表示された'ときに評価されます。そしてそれは$(jobs)

例えば

$ PS1='
> $(jobs)
> $ '


$ sleep 1000 &
[1] 7541

[1] +  Running                 sleep 1000 &
$ sleep 1000 &
[2] 7543

[2] +  Running                 sleep 1000 &
[1] -  Running                 sleep 1000 &
$ kill %1
[1] - Terminated               sleep 1000 &

[2] +  Running                 sleep 1000 &
$ kill %2
[2] + Terminated               sleep 1000 &


$ 

(このテストはksh93を使用してDebian Jessieで行われましたが、すべてのksh93バリアントで動作する必要があります。テストするksh88はありません。)

答え2

私の実際の問題は、(私の質問の単純化された例とは異なり)実際に関数のjobs出力を調整して、実行中のタスクと停止したタスクを区別することです。

これは私のBashコードです。

typeset runningJobs=$(jobs -r | wc -l)
typeset stoppedJobs=$(jobs -s | wc -l)

次のようにKornシェルに移植しました。

typeset runningJobs=$(jobs | grep -c ' Running ')
typeset stoppedJobs=$(jobs | grep -c ' Stopped ')

これ管路内部的には、コマンド置換は$(...)実際にjobsサブシェルで実行を引き起こします(したがって、常に出力は生成されません)。これは変数から出力をキャプチャすることで防ぐことができます。次の書き換えは期待どおりに機能します。

typeset jobOutput=$(jobs)
typeset runningJobs=$(printf '%s\n' "$jobOutput" | grep -c ' Running ')
typeset stoppedJobs=$(printf '%s\n' "$jobOutput" | grep -c ' Stopped ')

実際の問題を理解するのに役立つ@StephenHarrisの答えに感謝します!

関連情報