Anda dapat membuatnya dengan nama yang dibuat secara acak, lalu ganti nama (mv -n random desired
) ke tempatnya dengan nama yang diinginkan. Penggantian nama akan gagal jika file sudah ada.
Seperti ini:
#!/bin/bash
touch randomFileName
mv -n randomFileName lockFile
if [ -e randomFileName ] ; then
echo "Failed to acquired lock"
else
echo "Acquired lock"
fi
Solusi bash murni 100%:
set -o noclobber
{ > file ; } &> /dev/null
Perintah ini membuat file bernama file
jika tidak ada file bernama file
. Jika ada file bernama file
, lalu tidak melakukan apa pun (tetapi mengembalikan kode pengembalian bukan nol).
Pro menulis touch
perintah:
- Tidak memperbarui stempel waktu jika file sudah ada
- 100% bash bawaan
- Kembalikan kode seperti yang diharapkan:gagal jika
file
sudah ada atau jikafile
tidak dapat dibuat; sukses jikafile
tidak ada dan telah dibuat.
Kontra:
- perlu menyetel
noclobber
opsi (tetapi tidak apa-apa dalam skrip, jika Anda berhati-hati dengan pengalihan, atau menghapusnya setelah itu).
Saya kira solusi ini benar-benar pasangan bash dari open
panggilan sistem dengan O_CREAT | O_EXCL
.
Inilah fungsi bash menggunakan mv -n
trik:
function mkatomic() {
f="$(mktemp)"
mv -n "$f" "$1"
if [ -e "$f" ]; then
rm "$f"
echo "ERROR: file exists:" "$1" >&2
return 1
fi
}
Contoh:
$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo