Usando o exec 1 e 2 em uma função de script de shell POSIX. Irá interferir com outros redirecionamentos io?

1

Eu estou no processo de escrever um script de shell POSIX.

Eu tenho uma função, que redireciona (quase) toda a saída para um fluxo de erro padrão assim:

# print something to stderr
printf "..." $var 1>&2

Foi apontado para mim que existe uma maneira de redirecionar toda a saída da função com:

# redirect all output to standard error stream
exec 1>&2

mantendo esta linha no começo da função.

Se não houvesse outros redirecionamentos, eu simplesmente concordaria provavelmente, mas eu tenho lá um teste para suporte de cores:

# check if we have color support
if command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1

Basicamente, eu não sei como o exec funciona, e eu não preciso saber muito em detalhes agora, eu só preciso saber se a linha exec irá interferir no teste de suporte de cor acima de qualquer forma ?

    
por Vlastimil 04.10.2018 / 06:06

1 resposta

3

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.

    
por 04.10.2018 / 06:34