Я не думаю, что ваше утверждение выше о том, что вторая команда потерпит неудачу, если первая потерпит неудачу, верно. Если mv dir1 dir1_backup
потерпит неудачу, то dir1 все еще будет существовать, а mv dir2 dir1
сделает dir2 подкаталогом dir1. Кроме того, поскольку вы передаете -f
в rm
в третьей команде, он не сможет удалить несуществующий каталог.
Для справки, три оператора bash (здесь предполагается bash) и что они делают:
- ; просто выполняет следующую команду после первого выхода, независимо от статуса выхода.
- && выполняет следующую команду только в том случае, если предыдущая команда завершилась корректно (т. е. имела статус выхода 0).
- || выполняет следующую команду только в том случае, если предыдущая команда завершилась некорректно (т. е. имела ненулевой код выхода).
Если вы хотите, чтобы выполнение каждой команды зависело от успешного выполнения предыдущей команды, вы можете рассмотреть что-то вроде следующего:
mv dir1 dir1_backup && mv dir2 dir1 && rm -rf dir1_backup
Если перемещение каталога является режимом отказа, который вы ожидаете, то может быть разумно проверить возвращаемое значение перемещения или проверить существование ожидаемого каталога, прежде чем приступить к удалению старого содержимого каталога. Если тест не пройден, верните старое содержимое каталога. Общая операция завершится неудачно, но, по крайней мере, вы не окажетесь в недопустимом состоянии. Например:
mv dir1 dir1_backup && \
mv dir2 dir1 && \
rm -rf dir1_backup || mv dir1_backup dir1
Поскольку мы знаем, что &&
выполняет следующую команду только в случае успешного завершения предыдущей команды, mv dir2 dir1
будет выполняться только в случае успеха mv dir1 dir1_backup
.
Кроме того, rm -rf dir1_backup
будет выполняться только в том случае, если перемещение каталога dir2 в каталог dir1 будет успешным. Однако, если последний код выхода (код, возвращаемый mv dir2 dir1
в случае сбоя) не равен нулю, оператор ||
вызывает выполнение mv dir1_backup dir1
.
Надеюсь, это поможет! Дайте мне знать, если это нуждается в разъяснении.
person
cfunk
schedule
14.06.2013
&&
вместо;
для разделения команд? К сожалению, несмотря на то, что&&
должен работать, я не уверен, что когда-нибудь захочу делать ставку на магазин таким образом. Я бы создал что-то, что выполняет проверки, особенно перед последнимrm
шагом. Удачи. - person shellter   schedule 14.06.2013mv -T point_to_dir2 point_to_dir1
не сработает в вашем крайнем случае. - person Fredrik Wendt   schedule 25.05.2016