给出以下代码:
out="$(mktemp)"
rm -f "$out"
clear
printf '%s\n' 0 >"$out"
{
printf '%s\n' '1' >/dev/stdout
printf '%s\n' '2' >/dev/stdout
} >"$out"
cat -e -- "$out"
rm -f "$out"
在 Ubuntu 上输出:
2$
在 MacOS 上输出:
1$
2$
当明确附加时,它们的行为一致:
out="$(mktemp)"
rm -f "$out"
clear
printf '%s\n' 0 >"$out"
{
printf '%s\n' '1' >/dev/stdout
printf '%s\n' '2' >>/dev/stdout
} >"$out"
cat -e -- "$out"
rm -f "$out"
在 MacOS 和 Ubuntu 上输出:
1$
2$
对我来说最令人困惑的例子是这个:
out="$(mktemp)"
rm -f "$out"
clear
printf '%s\n' 0 >"$out"
exec 3>>"$out"
{
printf '%s\n' '1' >/dev/stdout
printf '%s\n' '2' >/dev/stdout
} >&3
{
printf '%s\n' '3' >/dev/stdout
printf '%s\n' '4' >/dev/stdout
} >&3
cat -e -- "$out"
rm -f "$out"
exec 3>&-
在 MacOS 上输出:
0$
1$
2$
3$
4$
在 Ubuntu 上输出:
4$
我期望在 Ubuntu 上实现这一点:
0$
2$
4$
我完全搞不清楚为什么会出现这种行为,在这个例子中,以及在我设计的所有其他例子中,都出现了这种行为,以说明这种差异。
我的问题:
- 这种差异是什么?发生了什么?这种差异是故意的吗?
- 这种差异还适用于哪些地方?其根源是什么?
- 如果这种差异是故意的,那么为什么要这样做呢?哪一个应该是正确的行为?
- 在编写跨操作系统脚本时,如何才能减轻这些差异?
- 这是
shopt -o noclobber
适当的回应吗?这是真正的必要吗noclobber
?