Voglio un Bash one-liner che crea atomicamente un file se non esiste. Ciò significa essenzialmente "se il file non esiste, crearlo", ma garantire che nessun altro riesca a creare il file nel piccolo spazio tra fare l'if e creare il file.
Voglio un Bash one-liner che crea atomicamente un file se non esiste. Ciò significa essenzialmente "se il file non esiste, crearlo", ma garantire che nessun altro riesca a creare il file nel piccolo spazio tra fare l'if e creare il file.
Risposte:
Rubare una risposta da vari commenti e collegamenti a [SO]. Sembra che esista un metodo conforme a POSIX che non comporta mkdir
come ho menzionato nella mia risposta originale di seguito
set -o noclobber # or set -C
{ > file ; } &> /dev/null
Questo reindirizzamento al file restituisce 0 o non riesce e restituisce un valore diverso da zero se il file esiste già.
Risposta originale
Dovrai usare mkdir
: è atomico, o la directory viene creata e puoi continuare o non viene creata, quindi intraprendi le azioni appropriate.
Naturalmente, mkdir
non crea un file, ma una volta che sai di avere accesso esclusivo alla directory, puoi creare il file desiderato.
Per quanto riguarda una fodera - lo lascerò a te. Personalmente lo scriverei su poche righe, in quanto sarà più mantenibile.
È un file o una directory? Se il file, è possibile utilizzare un semplice tocco di comando: se il file esiste, modifica solo l'ora dell'ultimo accesso. Se il file non esiste, viene creato.
Se non ti interessa il nome del file, puoi delegare questa attività a un'utilità, ad esempio mktemp
Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is
implied. Files are created u+rw, and directories u+rwx, minus umask
restrictions.
Invocazione:
filename=$(mktemp)