이러한 반환 값을 이해할 수 없습니다.
을 실행하면 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
다른 형식 에서도 유사하게 동작하는지 확인했습니다 .bash
zsh
bash
다음에서 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