Bash one-liner, aby atomowo utworzyć plik, jeśli nie istnieje
9
Chcę jedno-liniowy Bash, który atomowo tworzy plik, jeśli nie istnieje. Oznacza to w zasadzie „jeśli plik nie istnieje, utwórz go”, ale upewnienie się, że nikomu innemu nie uda się utworzyć pliku na małej przestrzeni między wykonaniem if a utworzeniem pliku.
Kradzież odpowiedzi z różnych komentarzy i linków do [SO]. Wydaje się, że istnieje metoda zgodna z POSIX , która nie wymaga, mkdirjak wspomniałem w mojej oryginalnej odpowiedzi poniżej
set-o noclobber # or set -C{> file ;}&>/dev/null
To przekierowanie do pliku zwraca 0 lub kończy się niepowodzeniem i zwraca wartość niezerową, jeśli plik już istnieje.
Oryginalna odpowiedź
Musisz użyć mkdir- to atomowy, albo katalog zostanie utworzony i możesz kontynuować, albo nie zostanie utworzony, więc podejmij odpowiednie działania.
Oczywiście mkdirnie tworzy pliku, ale gdy wiesz, że masz wyłączny dostęp do katalogu, możesz utworzyć plik, który chcesz w nim znaleźć.
Co do jednej wkładki - pozostawię to tobie. Osobiście napisałbym to w kilku wierszach, ponieważ będzie to łatwiejsze w utrzymaniu.
@womble tak, ale w odpowiedzi wspomniano POSIX, co ktoś może uznać za odpowiedź na inne powłoki. Ksh88 jest nadal standardową powłoką na niektórych serwerach.
Czy to plik lub katalog? Jeśli plik, możesz użyć prostego polecenia dotykowego - jeśli plik istnieje, wystarczy zmodyfikować czas ostatniego dostępu. Jeśli plik nie istnieje, zostaje utworzony.
Jeśli nie zależy Ci na nazwie pliku, możesz przekazać to zadanie narzędziu, na przykład 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.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.