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
filebereits vorhanden oder wennfilekonnte nicht erstellt werden; Erfolg wennfileexistierte nicht und wurde erstellt.
Nachteile:
- muss den
noclobbersetzen 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