Dlaczego warto korzystać z install zamiast cp i mkdir?


Odpowiedzi:


57

To zależy od tego, co robisz.

installPolecenie jest zwykle używane w skryptach instalacyjnych, które pochodzą z opakowań i kod źródłowy dla instalacji binarny do systemu. Można go również użyć do zainstalowania dowolnego innego pliku lub katalogu. Oprócz opcji -di, -cktóre masz -mdo określenia nowych uprawnień do pliku, który ma zostać zainstalowany, więc nie musisz wykonywać czynności A cpi A, chmodaby uzyskać ten sam wynik. Na przykład:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

Masz również opcje -gi odpowiednio -oustawić grupę docelową i właściciela. Pozwala to uniknąć oddzielnych połączeń z chown. Ogólnie rzecz biorąc, użycie installskraca skrypt i sprawia, że ​​jest bardziej zwięzły, tworząc pliki, kopiując, ustawiając tryb i powiązane rzeczy w jednym poleceniu zamiast wielu.

W celach informacyjnych patrz man install. Aby użyć, spójrz na dowolny skrypt instalacyjny dostarczony z kodem źródłowym pakietu .


21

„Instaluj” zazwyczaj łączy następujące działania:

  • Kopiowanie określonego pliku do miejsca docelowego, które jest wykonywane w odniesieniu do procesów, które używają starej kopii. W przeciwieństwie do „cp”, „install” albo rozłącza plik przed utworzeniem nowego, albo (w systemach BSD z przełącznikiem -S) tworzy nowy i zmienia nazwę na docelową nazwę atomowo, co pozwala uniknąć wyścigu między instalacją a ponownym otwarciem . Jeśli tego nie użyjesz, kopiowanie może się nie powieść (z ETXTBSY) dla działającego pliku binarnego lub spowodować awarię, jeśli plik biblioteki lub plik danych zostanie zastąpiony.
  • Ustaw odpowiednie poświadczenia dla nowego pliku bez potrzeby oddzielnych poleceń.
  • Utwórz katalogi pośrednie, jeśli są wymagane.
  • Unikaj modyfikowania pliku docelowego, jeśli jest identyczny z nową wersją (przełącznik -C).

Tak więc, zgodnie z podejściem uniksowym, należy stworzyć narzędzie do jednego, ale kompletnego działania polegającego na zainstalowaniu pliku wykonanego przez narzędzie budowlane w jego lokalizacji roboczej.

Kompletna koncepcja, którą opisałem, jest zaimplementowana w systemach BSD (w tak zwanej wersji „xinstall”); Traktuję tutaj tryb „bezpiecznego kopiowania” (nowa wersja z atomową zmianą nazwy). Systemy Linux (od coreutils) nie mają tej ważnej części i są podatne na wyścigi między usuwaniem a ponownym otwarciem przez przypadkowy proces; ale mogą to być objęte przez menedżerów pakietów.


2
Użycie installlub $(INSTALL)w plikach makefile oznacza również te kroki jako kroki kopiowania instalacji, a nie niektóre zwykłe kroki kopiowania. To może być przydatne.
Kaz

Występuje wyścig w instalacji coreutils ... czy istnieje poprawka, czy alternatywa, która robi to poprawnie?
trent

@trentw jaki rodzaj wyścigu?
Netch

8

Oprócz poprzednich opisów tutaj dotyczących użycia, istnieje niewielka różnica poziomów między, cpa installprzynajmniej w Linuksie. W przypadku kopiowania na istniejącym pliku, cpzastępuje on istniejący i-węzeł pliku, a installzawsze tworzy nowy i-węzeł dla tej samej nazwy pliku.

To robi różnicę podczas instalowania nowej wersji działającego pliku binarnego. Użycie cppowoduje błąd EBUSY, podczas gdy installsię powiedzie. Działający plik binarny nadal będzie korzystał ze starej wersji, ale nowa wersja jest używana, jeśli program zostanie zrestartowany.


To ciekawe ... Więc może utworzyć plik o tej samej nazwie, ale z innym i-węzłem?
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel Tak. Dla użytkownika będzie tylko jeden plik, ponieważ pliki są zwykle wyszukiwane według nazwy. Ale w systemie plików istnieją dwa pliki, o ile jakiś proces zawiera odniesienie do starego pliku. To samo można osiągnąć, zmieniając nazwę lub usuwając plik otwierany przez proces, a następnie tworząc nowy plik o tej samej nazwie.
Tomas Skäre

4

Jeśli dany katalog już istnieje:

  • mkdir -p spróbuje ustawić bity własności i trybu plików
  • install -d nie będzie próbował ustawić bitów własności i trybu plików

To jest dla mkdiri installod coreutils GNU . Oba używają tej samej make_dir_parentsfunkcji, ale z preserve_existingparametrem ustawionym odpowiednio na falselub true.


1
Przydatne różnicowanie!
Victor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.