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/filee 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.