Вы получите правильный результат, выполнив cp
вместе с mv
. Это либо заменит «B» новой копией «A», либо оставит «B» таким, каким он был раньше.
cp A B.tmp && mv B.tmp B
обновление для соответствия существующимB
:
cp A B.tmp && if [ ! -e B ]; then mv B.tmp B; else rm B.tmp; fi
Это не 100% атомарность, но близко к этому. Существует состояние гонки, когда две из этих вещей работают, обе одновременно входят в тест if
, обе видят, что B
не существует, затем обе выполняют mv
.