Um pouco de redirecionamento de shell
Aqui está como fazemos normalmente redirecionamento shell
$ ./pgm.sh args >out.txt 2>err.txt
Eu queria modificá-lo um pouco e executar os seguintes
$ ./pgm.sh args
com a exigência de que a saída de erro e deve ir para algum arquivo dentro pgm.sh calculado com base em argumentos. Um caso ilustrativo poderia ser quando data faz 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 redirecionamento 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 alguns OUTFILE variável, poderíamos ter acabado de fazer exec 1>$OUTFILE
Que resolve o problema atual. Mas você pode gostar de passar por exemplo a seguir, que atinge "acesso aleatório" do arquivo no script shell. 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 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



































