Bash: redirecionar para arquivo, sempre criar novos

8

No bash, um link de comando

echo test > actual.txt

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

Especificamente, o comando redirecionar falha neste cenário:

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

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

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

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

Eu estava pensando, no entanto, se havia algum ajuste nas opções do bash ou o operador de redirecionamento que impediria esse modo de falha. Alguma ideia?

itsadok
fonte
E se link.txthouver um link para /dir/fileonde /direstá um arquivo do tipo diretório para o qual você tem permissão de gravação e pesquisa, mas /dir/filenão existe (e o redirecionamento o criaria sem uma mensagem de erro)? E se /dir/fileexistir, mas não for um arquivo comum (dispositivo, fifo, diretório ...), ou você não tem permissão de gravação ou pesquisa /dir?
Stéphane Chazelas

Respostas:

7

Tentar gravar em um link simbólico morto é equivalente a tentar gravar 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) bashe não há opções de shell bashque o tornem automático.

Se o caminho intermediário existir, mas o ponto final do link não existir, 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 refere a um arquivo comum que existe ( -f). Se for um link simbólico, mas não se refere a um arquivo, você o exclui.

Kusalananda
fonte
1
O ponto da minha pergunta era que eu não estou tentando escrever para nada. Quero criar um novo arquivo chamado link.txte, por acaso, existe um link simbólico no mesmo local. Para colocar isso na forma de uma pergunta: por que me preocupar com o teste se vou substituir o arquivo na próxima linha? Eu posso apenas fazer rm -fe terá o mesmo efeito.
itsadok 31/01
3
@itsadok Ah. Sim. Fazer isso rm -f filenameantes de escrever com o redirecionamento também resolveria o seu problema. Mas também depende se você deseja que ele esteja no diretório atual ou no diretório em que o ponto final do link simbólico está localizado.
Kusalananda
Você ainda pode não ter as permissões para rmo arquivo ou gravar nele. Como em muitos casos, você não pode se preparar para tudo. Você precisa avaliar quais casos realmente espera (mesmo que em raras ocasiões) e, portanto, manipular, quais casos você considera tão improváveis ​​que não os manipula intencionalmente e aceita que haverá uma certa quantidade de casos que você não considera e portanto, não pode lidar.
Alfe 31/01