【问题标题】:Unexpected broken pipe error in shell pipeline inside Jupyter Notebook terminalJupyter Notebook 终端内的 shell 管道中出现意外的断管错误
【发布时间】:2020-04-14 09:16:25
【问题描述】:

当我在包含太多文件的目录中运行ls -l | head 时遇到ls: write error: Broken pipe。我在运行ls | head 时没有遇到这个问题。我只是想知道为什么-l 选项会导致这个问题。我也想知道如何解决这个问题,但仍然打印了很长的文件信息。

要重现我的问题,您可以先在 Jupyter Notebook 提供的终端中打开一个,

然后运行以下代码。

cd
mkdir test
cd test
for i in {1..200}; do touch $i; done
ls -l | head

输出如下。

total 0
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 1
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 10
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 100
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 101
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 102
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 103
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 104
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 105
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 106
ls: write error: Broken pipe

【问题讨论】:

  • 我无法重现此内容,但请查看 How can I fix a broken pipe error。可能您的 shell(以及由此启动的任何命令)忽略了 SIGPIPE(作为说明,(trap '' PIPE; ls -l | head) 将可靠地重现您的问题)。您可以使用内置的trap -p 来查看bash shell 的信号配置@
  • 我无法重现此错误 - 我尝试了 20,000 个文件,但 ls -l | head 按预期工作 - 可能与您的 shell(bash v5?)或您的 ls 命令(gnu ls ?) ?
  • 感谢大家的帮助!我现在发现如果使用 Jupyter Notebook 提供的终端会遇到这个问题。如果我使用 Git Bash 等其他终端,一切都很好。我已相应地编辑了我的问题,感谢您的进一步帮助。我使用 Jupyter Notebook Terminal 主要是因为我想做网页上的所有事情。

标签: bash shell jupyter-notebook


【解决方案1】:

Python(至少是旧版本的 python2)doesn't reset SIGPIPE handling for subprocesses

这意味着由它启动的任何命令(例如,您在 Jupyter 笔记本中启动的命令)都将忽略 SIGPIPE,就像您发出 trap '' PIPE 一样。反过来,这意味着管道中的命令在尝试写入stdout 时不会捕获发送给他们的SIGPIPE,而管道中的以下命令(在您的情况下为tail)已完成,因此会看到写入错误。例如,请参阅this bug report

(trap '' PIPE; ls -l | head) 将在任何(非 Jupyter)shell 中可靠地重现您的问题。

显然,python3 has fixed this,所以你可以试试你的笔记本使用的changing the python version。或者,您可以通过发出 trap - PIPE 来尝试“取消忽略”SIGPIPE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2013-09-25
    • 2020-05-01
    • 2022-07-17
    • 1970-01-01
    相关资源
    最近更新 更多