Quiero un Bash one-liner que crea atómicamente un archivo si no existe. Eso significa esencialmente "si el archivo no existe, créelo", pero asegurando que nadie más logre crear el archivo en el pequeño espacio entre hacer el if y crear el archivo.
Quiero un Bash one-liner que crea atómicamente un archivo si no existe. Eso significa esencialmente "si el archivo no existe, créelo", pero asegurando que nadie más logre crear el archivo en el pequeño espacio entre hacer el if y crear el archivo.
Respuestas:
Robar una respuesta de varios comentarios y enlaces a [SO]. Parece que hay un método compatible con POSIX que no involucra mkdir
como mencioné en mi respuesta original a continuación
set -o noclobber # or set -C
{ > file ; } &> /dev/null
Esta redirección al archivo devuelve 0 o falla y devuelve un valor distinto de cero si el archivo ya existe.
Respuesta original
Tendrá que usar mkdir
: eso es atómico, o el directorio se crea y puede continuar o no se crea, por lo que debe tomar las medidas adecuadas.
Por supuesto, mkdir
no crea un archivo, pero una vez que sabe que tiene acceso exclusivo al directorio, puede crear el archivo que desee.
En cuanto a un trazador de líneas, te lo dejaré a ti. Personalmente lo escribiría en unas pocas líneas, ya que será más fácil de mantener.
¿Es un archivo o directorio? Si es un archivo, puede usar el comando táctil simple: si el archivo existe, simplemente modifica el último tiempo de acceso. Si el archivo no existe, se crea.
Si no le importa el nombre del archivo, puede delegar esta tarea a una utilidad, por ejemplo 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.
Invocación:
filename=$(mktemp)