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 ).