Especificando opções de redirecionamento através de uma variável, em um comando exec

2

Eu quero ser capaz de especificar o comando de redirecionamento / opções através de uma variável (que eu poderia definir com base em certas condições, etc.). Mas quando eu executo este script bash, por exemplo:

REDIRECT=">>test"
exec echo hi ${REDIRECT}

Eu recebo (via bash -x output):

+ REDIRECT='>>test'
+ exec echo hi '>>test'
hi >>test

Parece que exec está colocando o valor da variável REDIRECT dentro de aspas simples, em vez de literalmente substituir seu valor.

Como posso corrigir / contornar isso?

    
por user98708 26.07.2016 / 19:02

3 respostas

2

Para evitar o uso de eval :

opt_file=""

# Command line parsing bit here, setting opt_file to a
# file name given by the user, or leaving it empty.

if [[ -z "$opt_file" ]]; then
  outfile="/dev/stdout"
else
  outfile="$opt_file"
fi

exec echo hi >>"$outfile"
    
por 26.07.2016 / 19:29
0

Acho que a única maneira de fazer isso seria usar eval e todas as advertências clássicas sobre eval seria aplicável. Dito isso, você poderia fazer algo assim:

REDIRECT=">>test"
eval echo hi ${REDIRECT}
    
por 26.07.2016 / 19:17
0

Você pode redirecionar o todo de stdout para um arquivo com o comando exec eg

exec >> outfile

Agora, qualquer saída será enviada para outfile .

Por exemplo:

#!/bin/bash

exec >> outfile

echo start
echo hello
echo there
echo end

Se nós executarmos isso:

$ ./x

$ cat outfile 
start
hello
there
end

$ ./x

$ cat outfile
start
hello
there
end
start
hello
there
end

Assim, podemos ver cada execução anexada.

Isso se torna simples de adicionar em um teste

if [ -n "$REDIRECT" ]
then
  exec >> $REDIRECT
fi
    
por 26.07.2016 / 20:36