我无法理解这些返回值。
当我运行时jobs -s | wc -l
,根据我所在的目录,我会得到不同的结果。
如果我在暂停作业后返回的目录中,我会得到正确的答案。
如果我在任何其他目录中,我会得到正确答案 + 1。
看截图:
我还运行jobs -s | > test.txt
并获得了单行文档,然后运行wc -l < test.txt
并获得了正确的输出。
知道是什么原因造成的吗?正如您所看到的,它弄乱了我的 shell 提示符中的后台作业指示器(右侧,蓝色)。
任何有关如何修复此功能的建议将不胜感激:
#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
因为在后一种情况下有两行,一行被显示,另一行没有显示,因为它显示在子 shell 中,并且尾随换行符正在被计数。我已经检查过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
看起来 shell 正在跟踪当前工作目录,看看( p w d n 0000060 o w : / t m p )
,括号表示子 shell。
这是相关的源代码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
在子 shell 中运行:
( jobs ) | wc -l