当我从 Textadept 文本编辑器 F5(运行代码)功能 (
bash "%f"
) 运行代码并查看输出缓冲区中的输出时,会发生所描述的行为。从终端 shell 运行脚本时我无法重现它...(感谢 Charles Duffy 在评论中指出)。
我当前的解决方法是使用
sleep
,但时间量是故意选择的,无论在睡眠中使用哪个值,该方法都可能随机失败。
知道如何确保正确的顺序,以便 output()
函数的结果始终肯定出现在 -- 1 --
和 -- 2 --
之间吗?
output() { echo stdout; echo stderr >&2; }
echo ' --1-- '
output 3>&2 1>&2 2>&3
#sleep 0.001 # still causes the outcome of output be printed after echo '--2--'
sleep 0.01 # causes outcome of output be printed after echo '--1--'
echo ' --2-- '
要达到的输出:
--1--
stdout
stderr
--2--
输出没有
sleep
或睡眠值太小:
--1--
--2--
stdout
stderr
考虑编写一个结合了 stdout 和 stderr 的包装器脚本,并在使用像 Textadept 这样的工具单独读取这些流然后重新组合它们时在该包装器后面运行脚本。
例如,如果您创建一个脚本,并以名称
on-stdout
保存在 PATH 上的某个位置,其中包含以下内容:
#!/bin/sh
exec 2>&1 # make FD 2 (stderr) point to what's currently on FD 1 (stdout)
exec "$@" # replace ourselves with the script named by our arguments
...您可以告诉它运行
yourscript arg1 arg2
,而不是让 Textadept 运行 on-stdout yourscript arg1 arg2
。这将使 Textadept 传递的 stderr 句柄成为 stdout 句柄的副本;因为两个描述符都指向同一个句柄,所以操作系统将保证保留写入顺序。