Gnu
工作/廁所:得到奇怪的返回值
我無法理解這些返回值。
當我執行時
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 }
因為在後一種情況下有兩行,一條被顯示,另一條不是因為它顯示在一個帶有尾隨換行符的子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