Puede crearlo con un nombre generado aleatoriamente y luego cambiarle el nombre (mv -n random desired
) en su lugar con el nombre deseado. El cambio de nombre fallará si el archivo ya existe.
Así:
#!/bin/bash
touch randomFileName
mv -n randomFileName lockFile
if [ -e randomFileName ] ; then
echo "Failed to acquired lock"
else
echo "Acquired lock"
fi
Una solución bash 100 % pura:
set -o noclobber
{ > file ; } &> /dev/null
Este comando crea un archivo llamado file
si no existe un archivo llamado file
. Si hay un archivo llamado file
, luego no haga nada (pero devuelva un código de retorno distinto de cero).
Los profesionales escriben el touch
comando:
- No actualiza la marca de tiempo si el archivo ya existía
- 100 % basado en bash
- Código de retorno como se esperaba:error si
file
ya existía o sifile
no se pudo crear; éxito sifile
no existió y fue creado.
Contras:
- necesita establecer el
noclobber
opción (pero está bien en una secuencia de comandos, si tiene cuidado con las redirecciones o si la desactiva después).
Supongo que esta solución es realmente la contraparte bash del open
llamada al sistema con O_CREAT | O_EXCL
.
Aquí hay una función bash usando el mv -n
truco:
function mkatomic() {
f="$(mktemp)"
mv -n "$f" "$1"
if [ -e "$f" ]; then
rm "$f"
echo "ERROR: file exists:" "$1" >&2
return 1
fi
}
Ejemplos:
$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo