jobs/wc: 이상한 반환 값을 얻음

jobs/wc: 이상한 반환 값을 얻음

이러한 반환 값을 이해할 수 없습니다.

을 실행하면 jobs -s | wc -l내가 있는 디렉터리에 따라 다른 결과가 나타납니다.

작업을 일시 중지한 후 디렉터리로 돌아가면 정답을 얻습니다.

다른 디렉토리에 있으면 정답에 대해 +1을 얻습니다.

스크린샷 보기:

여기에 이미지 설명을 입력하세요.

또한 실행하여 jobs -s | > test.txt한 줄 문서를 얻은 다음 실행하여 wc -l < test.txt올바른 출력을 얻었습니다.

원인이 무엇인지 아시나요? 보시다시피, 내 쉘 프롬프트의 백그라운드 작업 표시기(오른쪽, 파란색)가 엉망이 되었습니다.

이 기능을 수정하는 방법에 대한 제안을 보내주시면 감사하겠습니다.

#tells us how many jobs are in the background  
function jobs_status() {
  count=$(jobs -s | wc -l)
  if [[ $count -ne "0" ]]; then
    echo "$bg_jobs$split$fg_text $count $fg_jobs"
  fi
}

답변1

후자의 경우 두 줄이 있으므로 하나는 표시되고 다른 하나는 서브셸에 표시되고 후행 줄 바꿈이 계산되기 때문에 표시되지 않습니다. 이 동작이 에 존재하며 zsh다른 형식 에서도 유사하게 동작하는지 확인했습니다 .bashzshbash

다음에서 ASCII 덤프를 확인하십시오 zsh.

/tmp/test% jobs
[1]  + running    tail -f /var/log/syslog

/tmp/test% jobs | wc -l
1

/tmp/test% jobs | od -c
0000000   [   1   ]           +       r   u   n   n   i   n   g        
0000020           t   a   i   l       -   f       /   v   a   r   /   l
0000040   o   g   /   s   y   s   l   o   g  \n
0000052

/tmp/test% cd ..

/tmp% jobs | wc -l
2

/tmp% jobs | od -c
0000000   [   1   ]           +       r   u   n   n   i   n   g        
0000020           t   a   i   l       -   f       /   v   a   r   /   l
0000040   o   g   /   s   y   s   l   o   g  \n   (   p   w   d       n
0000060   o   w   :       /   t   m   p   )  \n
0000072

쉘이 현재 작업 디렉토리(look )를 추적하는 것처럼 보입니다. ( p w d n 0000060 o w : / t m p )대괄호는 하위 쉘을 나타냅니다.

관련 소스 코드 는 다음과 같습니다 zsh.jobs.c

/* print "(pwd now: foo)" messages: with (lng & 4) we are printing
 * the directory where the job is running, otherwise the current directory
 */

    if ((lng & 4) || (interact && job == thisjob &&
                      jn->pwd && strcmp(jn->pwd, pwd))) {
        doneprint = 1;
        fprintf(fout, "(pwd %s: ", (lng & 4) ? "" : "now");
        fprintdir(((lng & 4) && jn->pwd) ? jn->pwd : pwd, fout);
        fprintf(fout, ")\n");
        fflush(fout);
    }

다음 bash이 있지만:

      if (strcmp (temp, jobs[job_index]->wd) != 0)
        fprintf (stream,
          _("  (wd: %s)"), polite_directory_format (jobs[job_index]->wd));

원하는 것을 얻으려면 jobs서브셸에서 실행할 수 있습니다.

( jobs ) | wc -l

관련 정보