Um pouco de redirecionamento de shell
Aqui está como fazemos normalmente redirecionamento shell
$ ./pgm.sh args >out.txt 2>err.txt
Eu queria modificar um pouco e executado da seguinte forma
$ ./pgm.sh args
com a exigência de que a saída de erro e deve ir para algum nome calculado dentro pgm.sh com base em argumentos. Um caso ilustrativo poderia ser quando a data é parte de args. Então você gostaria de ir stdout para dizer / o diretório / / pgm_out_YYYYMMDD.txt 1
O problema com a maneira padrão de redirecionar N>file.txt ou seja, associando arquivo descritor de N para file.txt, é que ele funciona apenas para o processo recém-bifurcada e não para o processo atual.
assim
$ echo hi 1>out.txt ; echo hii . enviará oi para out.txt mas irá imprimir hii para stdout 2
Este é o lugar onde exec vem em nosso socorro. Se somarmos exec 1>somefile.txt , em seguida, saída do resto do script irá para o arquivo.txt
$. / Test.sh irá redirecionar oi, bem como a hii out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Da mesma forma para redirecionar stdout stderr, assim como nós vamos fazer algo assim
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Agora, voltando ao ponto original de redirecionar para algum arquivo de dentro da casca, digamos programa de computado o nome do arquivo em algum OUTFILE variável, poderíamos ter acabado de fazer exec 1>$OUTFILE
Isso resolve o problema atual. Mas você pode gostar de ir por exemplo a seguir que atinge "acesso aleatório" do arquivo em shell script. Exemplo é a partir daqui
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
Com os comentários, este código é auto-explicativo.
-
1 Também pode ser feito por $ ./pgm.sh args >pgm_out`date +%Y%m%d` mas a idéia é gerar esse nome de arquivo com base em alguma lógica no próprio programa.
2 1 em 1> out.txt é redundante, mas esclarece que aqui estamos redirecionando fd 1



































