왜 cp와 mkdir보다는 install을 사용합니까?


답변:


58

그것은 당신이하는 일에 달려 있습니다.

install명령은 일반적으로 시스템에 바이너리를 설치하기위한 패키지 및 소스 코드와 함께 제공되는 설치 스크립트에서 사용됩니다. 다른 파일이나 디렉토리를 설치하는 데에도 사용할 수 있습니다. 설치할 파일의 새 권한을 지정하기위한 -d-c옵션 외에도 동일한 결과를 얻기 위해 -ma cp및 a chmod를 수행 할 필요가 없습니다 . 예를 들어 :

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

대상 그룹과 소유자를 각각 설정하는 옵션 -g과 옵션도 있습니다 -o. 이것은에 대한 별도의 호출을 피합니다 chown. 일반적 install으로을 사용 하면 파일 작성, 복사, 모드 설정 및 관련 항목을 여러 명령 대신 하나의 명령으로 수행하여 스크립트 를 단축하고 더 간결하게 만들 수 있습니다.

자세한 내용은을 참조하십시오 man install. 사용법은 패키지 소스 코드 와 함께 제공된 설치 스크립트를 살펴보십시오 .


22

"install"은 일반적으로 다음 작업을 결합합니다.

  • 지정된 파일을 대상 위치에 복사하는 작업은 이전 사본을 사용하는 프로세스와 관련하여 수행됩니다. "cp"와 달리 "install"은 새 파일을 작성하기 전에 파일을 링크 해제하거나 (-S 스위치가있는 BSD 시스템에서) 새 파일을 작성하고 대상 이름으로 원자 이름을 변경하므로 설치와 다시 열기 사이의 경쟁 조건을 피합니다 . 이 파일을 사용하지 않으면 실행중인 이진 파일에 대한 복사 (ETXTBSY 사용)가 실패하거나 라이브러리 파일 또는 데이터 파일이 교체되면 충돌이 발생할 수 있습니다.
  • 별도의 명령없이 새 파일에 적절한 자격 증명을 설정하십시오.
  • 요청이있을 경우 중간 디렉토리를 만드십시오.
  • 대상 파일이 새 버전 (-C 스위치)과 동일한 경우 수정하지 마십시오.

따라서 Unix의 접근 방식에 따라 일부 건물 도구로 만든 파일을 작업 위치에 설치하는 단일의 완전한 조치를 위해 도구를 만들어야합니다.

내가 설명한대로 완전한 개념은 BSD 시스템 ( "xinstall"버전)에서 구현됩니다. 여기서는 "안전 복사"모드 (원자 이름 바꾸기 기능이있는 새 버전)를 여기에 중요하게 취급합니다. coreutils의 Linux 시스템은이 중요한 부분을 놓치고 방관자 프로세스에 의한 삭제와 다시 열기 사이에 경쟁이 발생하기 쉽습니다. 그러나 이것은 패키지 관리자가 다룰 수있었습니다.


2
또한 makefile을 사용 install하거나 사용하면 $(INSTALL)해당 단계가 일반적인 복사 단계가 아니라 설치 복사 단계로 표시됩니다. 유용 할 수 있습니다.
Kaz

coreutils 설치에서 경쟁이 발생했습니다 ... 수정이 있거나 대안이 올바르게 있습니까?
trent

@trentw 어떤 종류의 레이스?
Netch

8

외에도 여기에 사용에 대한 이전의 설명에서, 낮은 수준의 차이가 cp그리고 install적어도 리눅스에. 기존 파일을 복사하면 파일 cp의 기존 inode를 덮어 쓰는 동시에 install항상 동일한 파일 이름으로 새 inode를 만듭니다.

실행중인 바이너리의 새 버전을 설치할 때 차이가 있습니다. 를 사용 cp하면 EBUSY 오류가 발생하지만 install성공합니다. 실행중인 바이너리는 여전히 이전 버전을 사용하지만 프로그램을 다시 시작하면 새 버전이 사용됩니다.


흥미 롭습니다 ... 이름이 같지만 다른 inode를 가진 파일을 만들 수 있습니까?
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel 예. 파일은 일반적으로 이름별로 조회되므로 사용자에게는 하나의 파일 만 있습니다. 그러나 파일 시스템에는 일부 프로세스가 이전 파일에 대한 참조를 보유하는 한 두 개의 파일이 있습니다. 프로세스에 의해 열린 파일의 이름을 바꾸거나 파일을 삭제 한 후 동일한 파일 이름으로 새 파일을 작성하는 경우에도 동일한 결과를 얻을 수 있습니다.
Tomas Skäre

4

해당 디렉토리가 이미 존재하는 경우 :

  • mkdir -p 소유권 및 파일 모드 비트를 설정하려고 시도합니다
  • install -d 소유권 및 파일 모드 비트를 설정하지 않습니다

이것은입니다 mkdirinstall에서 GNU의로 coreutils . 둘 다 동일한 make_dir_parents기능을 사용 하지만 preserve_existing매개 변수가 각각 false또는 로 설정되어 true있습니다.


1
유용한 차별화!
Victor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.