exec <redirection>
irá redirecionar os fluxos de E / S do shell atual (ou subshell). E como os comandos iniciados pelo shell herdam os fluxos de E / S do shell, esses redirecionamentos os afetarão, com redirecionamentos específicos do comando aplicados no topo.
Então, com algo como:
exec >/some/file 2>&1
foo >/another/file
- Após o
exec
, a stdout do shell passa a/some/file
e stderr também vai para/some/file
. - Ao iniciar o foo, o shell redireciona o stdout do foo para
/another/file
, mas o stderr é herdado inalterado e irá para/some/file
.
Nestes comandos:
command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1
Você não está usando os fluxos stdout / stderr herdados. Primeiro, o stdout é redirecionado para /dev/null
, depois stderr também. Então, essa determinada linha exec
não afetará esses comandos.