当来自 Atom 的 bash 脚本是 运行 时,stdout 和 stderr 乱序
stdout and stderr are out-of-order when a bash script is run from Atom
我尝试编写一个小程序来列出一个不存在的目录并回显完成,在 .sh
文件中:
#!/bin/bash
ls notexist
echo 'done'
但是我的控制台输出在第一行完成,在列出不存在的目录的错误消息之前:
done
ls: notexist: No such file or directory
我不认为 bash 会为每一行代码自动创建一个线程,是吗?我在 macOS Big Sur 中使用终端。
编辑:我正在从 macOS Big Sur 中的 Atom 文本编辑器的 script
包间接访问终端。如果我 运行 通过 ./file.sh
.
直接在控制台中编码,错误就会消失
如果我们查看 the Atom script
plugin 的源代码,问题就很清楚了:
它创建一个 BufferedProcess
具有单独的 stdout 和 stderr 回调(使用它们,除其他外,确定是否 any 输出已写入这些流中的每一个)。
实现这个需要将 stdout 和 stderr 定向到不同的 FIFO。这意味着,与典型的终端不同,在典型的终端中,哪些内容被写入由 stdout 和 stderr 同时共享的单个 FIFO 有绝对的顺序,不能严格保证内容将按照与它相同的顺序通过这些函数进行处理写了。
作为变通方法,您可以 exec 2>&1
将所有内容放入脚本中以将所有内容放入 stdout,或 exec >&2
将所有内容放入 stderr。理想情况下,如果 script
插件不需要分别跟踪两个流,它会自己执行此操作,并仅在所有内容已重定向到的单个流上放置回调。
我尝试编写一个小程序来列出一个不存在的目录并回显完成,在 .sh
文件中:
#!/bin/bash
ls notexist
echo 'done'
但是我的控制台输出在第一行完成,在列出不存在的目录的错误消息之前:
done
ls: notexist: No such file or directory
我不认为 bash 会为每一行代码自动创建一个线程,是吗?我在 macOS Big Sur 中使用终端。
编辑:我正在从 macOS Big Sur 中的 Atom 文本编辑器的 script
包间接访问终端。如果我 运行 通过 ./file.sh
.
如果我们查看 the Atom script
plugin 的源代码,问题就很清楚了:
它创建一个 BufferedProcess
具有单独的 stdout 和 stderr 回调(使用它们,除其他外,确定是否 any 输出已写入这些流中的每一个)。
实现这个需要将 stdout 和 stderr 定向到不同的 FIFO。这意味着,与典型的终端不同,在典型的终端中,哪些内容被写入由 stdout 和 stderr 同时共享的单个 FIFO 有绝对的顺序,不能严格保证内容将按照与它相同的顺序通过这些函数进行处理写了。
作为变通方法,您可以 exec 2>&1
将所有内容放入脚本中以将所有内容放入 stdout,或 exec >&2
将所有内容放入 stderr。理想情况下,如果 script
插件不需要分别跟踪两个流,它会自己执行此操作,并仅在所有内容已重定向到的单个流上放置回调。