Bash: reindirizza al file, crea sempre nuovo


8

In bash, un link di comando

echo test > actual.txt

sostituirà il contenuto del file chiamato actual.txtcon "test" e creerà il file se non esiste. Tuttavia, se il file esiste, bash lo aprirà, lo troncerà e scriverà i nuovi contenuti nel file.

In particolare, il comando di reindirizzamento non riesce in questo scenario:

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

Bash 4.4.12 mi dà il messaggio di errore confuso link.txt: No such file or directory.

Un modo per evitare ciò è assicurarsi di eliminare il file prima di eseguire il comando reindirizzato.

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

Mi chiedevo, tuttavia, se ci fosse qualche modifica delle opzioni bash o l'operatore di reindirizzamento che impedirà questa modalità di errore. Qualche idea?


Cosa succede se link.txtè un collegamento a /dir/filedove si /dirtrova un file di tipo directory in cui si dispone dell'autorizzazione di scrittura e ricerca, ma /dir/filenon esiste (e il reindirizzamento lo creerebbe senza un messaggio di errore)? Che dire se /dir/fileesiste ma non è un file normale (dispositivo, fifo, directory ...) o non hai il permesso di scrittura o il permesso di ricerca /dir?
Stéphane Chazelas,

Risposte:


7

Cercare di scrivere su un collegamento simbolico morto equivale a provare a scrivere su un percorso che non esiste. Non c'è modo di "modificare" il reindirizzamento dell'output per creare il percorso (comprese le directory intermedie) bashe non ci sono opzioni di shell bashche lo rendono automatico.

Se esiste il percorso intermedio, ma il punto finale del collegamento no, verrà creato dal reindirizzamento.

Puoi fare qualcosa del genere

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

per verificare se "file" è un collegamento simbolico ( -h) e se si riferisce a un file normale esistente ( -f). Se si tratta di un collegamento simbolico ma non fa riferimento a un file, lo si elimina.


1
Il punto della mia domanda era che non sto cercando di scrivere a nulla. Voglio creare un nuovo file chiamato link.txte sembra che ci sia un collegamento simbolico nella stessa posizione. Per dirlo sotto forma di una domanda: perché preoccuparsi del test se ho intenzione di sovrascrivere il file nella riga successiva? Posso solo fare rm -fe avrà lo stesso effetto.
Il

3
@itsadok Ah. Sì. Fare semplicemente rm -f filenameprima di scriverlo con il reindirizzamento risolverebbe anche il tuo problema. Ma dipende anche se si desidera che si trovi nella directory corrente o nella directory in cui si trova il punto finale del collegamento simbolico.
Kusalananda

Potrebbero comunque mancare le autorizzazioni per rmil file o per scriverlo. Come in molti casi, non puoi prepararti a tutto. Devi valutare quali casi ti aspetti realmente (anche se in rare occasioni) e quindi gestirli, quali casi ritieni così improbabili da non gestirli intenzionalmente e accettare che ci sarà un certo numero di casi che non consideri e quindi non può gestire.
Alfe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.