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
fileya existía o sifileno se pudo crear; éxito sifileno existió y fue creado.
Contras:
- necesita establecer el
noclobberopció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