Bash one-liner untuk membuat file secara atom jika tidak ada


9

Saya ingin Bash one-liner yang secara atomis membuat file jika tidak ada. Itu pada dasarnya berarti "jika file tidak ada, buatlah" tetapi memastikan bahwa tidak ada orang lain yang berhasil membuat file dalam ruang kecil antara melakukan if dan membuat file.


Maaf, saya membaca 'secara atomis' sebagai 'secara otomatis.' Saya menghapus jawaban saya.
Aaron Copley

Jawaban:


6

Mencuri jawaban dari berbagai komentar dan tautan ke [SO]. Tampaknya ada metode yang sesuai POSIX yang tidak melibatkan mkdirseperti yang saya sebutkan dalam jawaban asli saya di bawah ini

set -o noclobber # or set -C
{ > file ; } &> /dev/null

Pengalihan ke file ini mengembalikan 0 atau gagal dan mengembalikan non-nol jika file sudah ada.


Jawaban asli

Anda harus menggunakan mkdir- itu atomik, baik direktori dibuat dan Anda dapat melanjutkan atau tidak dibuat sehingga Anda mengambil tindakan yang tepat.

Tentu saja, mkdirtidak membuat file tetapi setelah Anda tahu Anda memiliki akses eksklusif ke direktori maka Anda dapat membuat file yang Anda inginkan di dalamnya.

Mengenai satu liner - saya akan menyerahkannya kepada Anda. Secara pribadi saya akan menulisnya dalam beberapa baris, karena itu akan lebih bisa dipertahankan.


Tetapi noclobber dari stackoverflow.com/q/13828544/1207760 adalah lebih dari yang diinginkan OP.
Law29

Secara umum, Noclobber adalah jawaban yang bagus. Tapi itu tidak berhasil untuk ksh88.
jrw32982 mendukung Monica

1
@ JohnWiersba tetapi pertanyaannya adalah tentang bash.
womble

@ Womble ya tapi jawabannya menyebutkan POSIX yang mungkin diambil seseorang berarti bahwa jawaban itu berlaku untuk shell lain. Ksh88 masih merupakan shell standar pada beberapa server.
jrw32982 mendukung Monica

0

Apakah itu file atau direktori? Jika file, Anda dapat menggunakan sentuhan perintah sederhana - jika file ada, itu hanya mengubah waktu akses terakhir. Jika file tidak ada, dibuat.


0

Coba yang ini. Ini lnmenyediakan fungsionalitas uji-dan-set.

touch lock.$$.tmp
if ln lock.$$.tmp lock.dat 2>/dev/null
then
    echo "File is mine"
else
    echo "Test and set failed"
fi
rm -f lock.$$.tmp

0

Jika Anda tidak peduli dengan nama file, Anda dapat mendelegasikan tugas ini ke utilitas, misalnya mktemp

Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied.  Files are created u+rw, and directories u+rwx, minus umask
restrictions.

Doa:

filename=$(mktemp)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.