Niedawno ugryzłem się w niewłaściwym zachowaniu w moim skrypcie basha i zastanawiałem się:
- czy jest to oczekiwane zachowanie systemu, czy jest to błąd
- jakie są idealne obejścia
Zasadniczo problem sprowadzał się do tego. Najpierw miałem istniejącą strukturę katalogów z następującym układem.
/opt/dir/file.a
/opt/dir/file.b
/opt/dir/file
gdzie file
jest twarde łącze do file.a
. Chciałem wymienić file
z wybranym skryptem powłoki file.a
lub file.b
w zależności od parametrów, więc uruchomiłem coś takiego:
cp my_file /opt/dir/file
Problem polega na tym, że od tego czasu file
jest twardym linkiem do file.a
, (co oznacza, że te dwa pliki są tak naprawdę dwiema nazwami dla tego samego i-węzła), zmiana została odzwierciedlona w obu file
i file.a
. To było oczywiście nie to, co chciałem.
Wydaje się, że cp
polecenie skutecznie otwarte /opt/dir/file
z flagą obcięcia pliku coś w stylu: fopen("file", "w+")
. i napisałem do niego. Spodziewałem się, że złamie twarde łącze, odkąd kopiowałem Nowy plik do tej nazwy.
Czy to prawidłowe i oczekiwane zachowanie cp
? Wydaje mi się to mało intuicyjne. Kiedy kopiuję plik z jednej lokalizacji do drugiej, w moim umyśle zastępuję go, a nie przepisuję. Czy jest tam flaga? cp
uniknąć tego? Moja obecna praca polega na tym, że ja rm /opt/dir/file && cp my_file /opt/dir/file
.
Patrząc na stronę man to pojawia się że cp --remove-destination my_file /opt/dir/file
może być właściwym rozwiązaniem, ale wciąż jestem zainteresowany tym, co każdy ma do powiedzenia na ten temat.
Is there a flag for cp to avoid this?
sprawia, że jest to rzeczywiste pytanie. (na które sam odpowiedziałeś).