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ś).