Sie könnten es unter einem zufällig generierten Namen erstellen und dann umbenennen (mv -n random desired
) mit dem gewünschten Namen. Die Umbenennung schlägt fehl, wenn die Datei bereits existiert.
So:
#!/bin/bash
touch randomFileName
mv -n randomFileName lockFile
if [ -e randomFileName ] ; then
echo "Failed to acquired lock"
else
echo "Acquired lock"
fi
Eine 100 % reine Bash-Lösung:
set -o noclobber
{ > file ; } &> /dev/null
Dieser Befehl erstellt eine Datei namens file
wenn es keine existierende Datei mit dem Namen file
gibt . Wenn es eine Datei mit dem Namen file
, dann nichts tun (aber einen Rückgabecode ungleich Null zurückgeben).
Vorteile bezüglich touch
Befehl:
- Aktualisiert den Zeitstempel nicht, wenn die Datei bereits existiert
- 100 % integrierte Bash
- Rückgabecode wie erwartet:Fehler bei
file
bereits vorhanden oder wennfile
konnte nicht erstellt werden; Erfolg wennfile
existierte nicht und wurde erstellt.
Nachteile:
- muss den
noclobber
setzen Option (aber es ist in einem Skript in Ordnung, wenn Sie mit Umleitungen vorsichtig sind, oder sie danach deaktivieren).
Ich denke, diese Lösung ist wirklich das Bash-Gegenstück zu open
Systemaufruf mit O_CREAT | O_EXCL
.
Hier ist eine Bash-Funktion, die den mv -n
verwendet Trick:
function mkatomic() {
f="$(mktemp)"
mv -n "$f" "$1"
if [ -e "$f" ]; then
rm "$f"
echo "ERROR: file exists:" "$1" >&2
return 1
fi
}
Beispiele:
$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo