jobs / wc:获得奇怪的返回值

jobs / wc:获得奇怪的返回值

我无法理解这些返回值。

当我运行时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 中,并且尾随换行符正在被计数。我已经检查过zshbash这种行为存在于 中zshbash在不同的格式下表现相似。

查看以下来自 的 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。

这是相关的源代码zshjobs.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

相关内容