Я хочу однолінійку Bash, який атомно створює файл, якщо його не існує. Це по суті означає "якщо файл не існує, створити його", але гарантувати, що ніхто інший не вдається створити файл у невеликому просторі між виконанням if і створенням файлу.
Я хочу однолінійку Bash, який атомно створює файл, якщо його не існує. Це по суті означає "якщо файл не існує, створити його", але гарантувати, що ніхто інший не вдається створити файл у невеликому просторі між виконанням if і створенням файлу.
Відповіді:
Крадіжка відповіді з різних коментарів та посилань на [SO]. Здається, існує метод, сумісний з POSIX , який не передбачає, mkdir
як я вже згадував у своїй початковій відповіді нижче
set -o noclobber # or set -C
{ > file ; } &> /dev/null
Це переспрямування на файл повертає 0 або відмовляється і повертається не нульовим, якщо файл вже існує.
Оригінальна відповідь
Вам доведеться скористатися mkdir
- це атомно, або створюється каталог, і ви можете продовжувати, або він не створюється, тому вживайте відповідних дій.
Звичайно, mkdir
файл не створюється, але коли ви знаєте, що у вас є ексклюзивний доступ до каталогу, ви можете зробити потрібний файл у ньому.
Щодо одного лайнера - я це залишаю вам. Особисто я б написав це через кілька рядків, оскільки це буде більш ретельним.
Це файл чи каталог? Якщо файл, ви можете використовувати просту команду touch - якщо файл існує, він просто змінює останній час доступу. Якщо файл не існує, створюється.
Якщо ви не переймаєтесь назвою файлу, ви можете делегувати це завдання утиліті, наприклад 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.
Виклик:
filename=$(mktemp)