Dado o seguinte código:
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"
No Ubuntu isso produz:
2$
No MacOS isso gera:
1$
2$
Ao anexar explicitamente, eles se comportam de forma consistente:
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"
No MacOS e no Ubuntu isso gera:
1$
2$
O exemplo mais confuso para mim é este:
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>&-
Que no MacOS gera:
0$
1$
2$
3$
4$
Que no Ubuntu gera:
4$
Eu esperava isso no Ubuntu:
0$
2$
4$
Estou completamente confuso sobre o porquê desse comportamento ocorrer neste exemplo e em todos os outros exemplos que criei para ilustrar essa discrepância.
Minhas perguntas:
- O que é essa discrepância? O que está acontecendo? Essa discrepância é intencional?
- Onde mais essa discrepância se aplica? Quais são suas origens?
- Se essa discrepância é intencional, por que foi justificada? Qual deveria ser o comportamento correto?
- O que pode ser feito para atenuar essas diferenças ao escrever scripts entre sistemas operacionais?
- É
shopt -o noclobber
a resposta apropriada? É essa a verdadeira necessidade denoclobber
?