Quando um arquivo é aberto, ele permanece aberto até que o processo seja fechado. Ler e escrever de um arquivo não importa se o arquivo ainda está disponível em seu nome original. O arquivo pode ter sido renomeado, excluído, sombreado ... ainda é o mesmo arquivo.
Se você abrir um arquivo /somewhere/somefile
, monte um sistema de arquivos em /somewhere
, depois desse ponto /somewhere/somefile
designará um arquivo no novo sistema de arquivos. Mas isso só importa quando você abre /somewhere/somefile
. Se um processo já tiver aberto /somewhere/somefile
no sistema de arquivos original, isso não muda.
Redirecionamento abre um arquivo quando o shell processa o operador de redirecionamento. Depois disso, ele continua sendo o mesmo arquivo aberto, mesmo se vários processos estiverem envolvidos. Por exemplo, no snippet abaixo, program2
grava no arquivo em /mnt/log.txt
na partição raiz, enquanto program3
grava em /log.txt
on /dev/something
.
do_stuff () {
program1
mount /dev/something /mnt
program2
program3 >/mnt/log.txt
}
do_stuff >/mnt/log.txt
Se você já iniciou um programa e deseja alterar o local de saída, é necessário solicitar que o programa o faça. Em teoria, você pode forçar o programa a fazê-lo usando um depurador - este tópico lista alguns programas que podem fazê-lo. Mas ficar abatido e sujo com um programa como esse pode derrubá-lo.
Se você realmente precisa mudar onde a saída do programa vai no meio do caminho, você precisa retransmitir a saída por meio de um auxiliar capaz de alterar sua própria saída. Aqui está uma minúscula prova de conceito em um script de shell:
my_background_process | {
while IFS= read -r line; do
printf '%s\n' "$line" >>/mnt/log.txt
done
} &
Este script abre o arquivo de saída para cada linha, portanto, se o arquivo designado por /mnt/log.txt
for alterado (porque o arquivo foi movido, porque um novo sistema de arquivos foi montado em /mnt
, etc.), as linhas subsequentes será gravado no novo arquivo. Observe que você precisa especificar o nome do diretório: com apenas >log.txt
, isso sempre abriria o arquivo no diretório atual, portanto, ele não seria afetado por uma operação de montagem (o diretório atual funciona como um arquivo aberto: A montagem de algo no /mnt
não afeta o que os processos vêem como seu diretório atual, mesmo que seu diretório atual seja /mnt
).