0より大きい場合にのみジョブ数を表示

0より大きい場合にのみジョブ数を表示

私は機能がありますjobscount()

jobscount() {
   local stopped='$(jobs -s | wc -l | tr -d " ")'
   local running='$(jobs -r | wc -l | tr -d " ")'
   echo -n "${running}r/${stopped}s"
}

私はこの機能を使います$PS1

PS1=" \w $(jobscount) \$ "

唯一の問題は、実行中のバックグラウンドプロセスがない場合、または停止したタスクがないと、その機能が$PS1無駄にスペースを占めることです。私が望むのはorstoppedrunning0その時現れる。

答え1

この方法をとても複雑にしました。出力がjobs空でないことを確認し、\jPS1文字列に追加します。

if [ -n "$(jobs -p)" ]; then echo "\j"; fi

私のプロンプトの一部は次のとおりです。

#Show number of jobs if at least one job
export PS1+='`if [ -n "$(jobs -p)" ]; then echo "(\j)"; fi`'

答え2

まず、見積もりを修正することをお勧めします。現在の関数は、コマンドプロンプトからスタンドアロンで実行したときに有用なデータを出力しません。

次に、次を使用して条件を追加します。OR リスト区切り記号、前にecho

jobscount() {
  local stopped=$(jobs -sp | wc -l)
  local running=$(jobs -rp | wc -l)
  ((running+stopped)) && echo -n "${running}r/${stopped}s "
}

PS1=' \w $(jobscount)\$ '

また、プロセスPIDのみを出力するように呼び出しを追加することをお勧め-pします。jobsそれ以外の場合は、yes $'foo\nbar' &2行目にリストされているコマンドが2回計算されます。

答え3

メッセージが表示されるたびにこのコマンドを実行するため、一部の外部呼び出しを保存することをお勧めします。

バックグラウンドジョブがある場合にのみカウントを表示するには、カウントを確認し、すべて0の場合は何も印刷しないでください。

Runはjobs -pプロセスIDのみを取得するため、信頼性の高い解析が簡単です。

jobscount() {
  set -- $(jobs -rp)
  set $# $(jobs -sp)
  set $1 $(($#-1))
  if [ $1 -ne 0 ] || [ $2 -ne 0 ]; then echo "${1}r/${2}s"; fi
}
PS1=' \w $(jobscount) \$ '

ただし、に割り当てるときは右側の引用符を参照してくださいPS1。二重引用符を使用すると、変数の設定時に関数が呼び出されます。値にPS1テキストが含まれ、プロンプトが$(jobscount)表示されるたびに関数が呼び出されるように単一引用符を使用する必要があります。

PROMPT_COMMAND関数の出力を使用する代わりに、変数を設定してフォークを保存できます。

set_jobscount () {
  set $(jobs -rp)
  set $# $(jobs -sp)
  set $1 $(($#-1))
  if [ $1 -ne 0 ] || [ $2 -ne 0 ]; then
    jobscount="${1}r/${2}s"
  else
    jobscount=
  fi
}
PROMPT_COMMAND="$PROMPT_COMMAND
set_jobscount"
PS1=' \w ${jobscount} \$ '

いつものように、zshはもっと簡単です(たとえ謎に見えますが)。

precmd () {
  jobscount=${(M)#${jobstates%%:*}:#running}r/${(M)#${jobstates%%:*}:#suspended}s
  if [[ $jobscount == r0/s0 ]]; then jobscount=; fi
}
setopt prompt_subst
PS1='… ${jobscount} …'

ここjobstatesZsh が提供する変数は、以下に由来します。zsh/parameter基準寸法。実行中または保留中のジョブのみを含むように出力を切り離します#running。ロゴ#suspended(M)%%パラメータ拡張(M)フラグは一致しない要素を削除し、それ以降のすべての要素を出力から%%削除します。:$jobstates

答え4

たとえば、PS1の$()はどうですか?

export PS1='\w $(if test "\j" -ne "0"; then echo -e "\033[32m\j "; fi )\[\033[01;35m\]\$\[\033[00m\] '

関連情報