Мне нужен однострочник Bash, который атомарно создает файл, если он не существует. По сути, это означает «если файл не существует, создайте его», но убедитесь, что никому другому не удастся создать файл в небольшом промежутке между выполнением if и созданием файла.
Кража ответа из различных комментариев и ссылок на [SO]. Кажется, есть POSIX-совместимый метод это не связано mkdir
как я уже упоминал в своем первоначальном ответе ниже
set -o noclobber # or set -C
{ > file ; } &> /dev/null
Это перенаправление на файл возвращает 0 или завершается ошибкой и возвращает ненулевое значение, если файл уже существует.
Оригинальный ответ
Вам придется использовать mkdir
- это атомарно, либо каталог создается, и вы можете продолжить, либо он не создается, поэтому вы предпринимаете соответствующие действия.
Конечно, mkdir
не создает файл, но как только вы узнаете, что у вас есть монопольный доступ к каталогу, вы можете создать в нем нужный файл.
Что касается однострочника - оставлю это вам. Лично я бы написал это в нескольких строках, так как это будет удобнее в обслуживании.
Это файл или каталог? Если файл, вы можете использовать простую команду touch - если файл существует, просто измените время последнего доступа. Если файл не существует, создается.
Попробуй это. В ln
обеспечивает функциональные возможности тестирования и настройки.
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
Если вас не волнует имя файла, вы можете делегировать эту задачу утилите, например 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)