Bash: redirecionar para arquivo, sempre criar novo

6

No bash, um link de comando

echo test > actual.txt

substituirá o conteúdo do arquivo chamado actual.txt por "teste" e criará o arquivo se ele não existir. No entanto, se o arquivo existir, o bash apenas o abrirá, truncará e gravará o novo conteúdo no arquivo.

Especificamente, o comando de redirecionamento falha neste cenário:

ln -s /some/illegal/path link.txt
echo test > link.txt

Bash 4.4.12 me dá a mensagem de erro confusa link.txt: No such file or directory .

Uma maneira de evitar isso é certificar-se de excluir o arquivo antes de executar o comando redirecionado.

rm link.txt && echo test > link.txt

Eu estava pensando, no entanto, se houve algum ajuste nas opções do bash ou no operador de redirecionamento, o que evitará esse modo de falha. Alguma idéia?

    
por itsadok 31.01.2018 / 08:10

1 resposta

7

Tentar escrever em um link simbólico morto é equivalente a tentar escrever em um caminho que não existe. Não há como "ajustar" o redirecionamento de saída para criar o caminho (incluindo diretórios intermediários) em bash , e não há opções de shell em bash que tornem isso automático.

Se o caminho intermediário existir, mas o ponto final do link não, ele será criado pelo redirecionamento.

Você pode fazer algo como

if [ -h file ] && [ ! -f file ]; then
    rm file
fi

para testar se "arquivo" é um link simbólico ( -h ) e se ele se refere a um arquivo regular que existe ( -f ). Se for um link simbólico, mas não se referir a um arquivo, exclua-o.

    
por 31.01.2018 / 08:39