为什么要使用install而不是cp和mkdir?


Answers:


57

这取决于您在做什么。

install命令通常在软件包和源代码附带的安装脚本中使用,以将二进制文件安装到系统中。它也可以用于安装任何其他文件或目录。除了-d-c选项之外,您还-m可以指定要安装的文件的新权限,因此不必进行cpchmod即可获得相同的结果。例如:

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

您还可以选择-g-o分别设定的目标群体和所有者。这样可以避免单独调用chown。通常,通过使用install一个命令(而不是多个命令)执行文件创建,复制,模式设置和相关操作,使用可以缩短脚本并使脚本更简洁。

供参考,请参阅man install。对于用法,只需看一下一些软件包源代码附带的任何安装脚本。


21

“安装”通常结合以下操作:

  • 将指定文件复制到目标位置,这是针对使用旧副本的过程完成的。与“ cp”不同,“安装”要么在创建新文件之前取消链接文件,要么(在BSD系统中,使用-S开关)创建一个新文件并原子地重命名为目标名称,从而避免了安装和重新打开之间的竞争情况。 。如果不使用它,则对于正在运行的二进制文件,复制可能会失败(使用ETXTBSY),如果替换了库文件或数据文件,则可能导致崩溃。
  • 无需单独的命令即可为新文件设置适当的凭据。
  • 根据需要创建中间目录。
  • 如果目标文件与新版本相同(-C开关),请避免对其进行修改。

因此,遵循Unix的方法,即应为安装某个构建工具生成的文件到其工作位置的单个但完整的动作创建工具。

我所描述的完整概念是在BSD系统中实现的(所谓的“ xinstall”版本)。为此,我将“安全复制”模式(具有原子重命名的新版本)视为至关重要。Linux系统(来自coreutils)错过了这一重要部分,并且易于在旁观者进程删除和重新打开之间进行竞争。但这可能已经由包管理器解决了。


2
在makefile中使用install$(INSTALL)在makefile中还将这些步骤标记为安装复制步骤,而不是某些常规复制步骤。那可能很有用。
卡兹(Kaz)

我在coreutils安装中遇到了竞争...是否有修复程序,或可正确执行此操作的替代方法?
特伦特(Trent),

@trentw什么样的比赛?
Netch

8

除了此处有关用法的先前描述之外,cpinstall至少在Linux上的区别很小。如果复制现有文件,cp则将覆盖文件的现有inode,同时install始终为相同文件名创建一个新inode。

这在安装运行二进制文件的新版本时会有所不同。使用cp会导致EBUSY错误,而install会成功。正在运行的二进制文件仍将使用旧版本,但是如果程序重新启动,将使用新版本。


很有意思...因此它可以创建一个具有相同名称但不同inode的文件?
Neaţu奥维迪乌·加布里埃尔

1
@NeaţuOvidiuGabriel是的。对于用户而言,只有一个文件,因为文件通常是按名称查找的。但是对于文件系统,只要某些进程持有对旧文件的引用,就有两个文件。如果您重命名或删除由进程打开的文件,然后使用相同的文件名创建一个新文件,则可以实现相同的目的。
TomasSkäre'18

4

如果问题目录已经存在:

  • mkdir -p 将尝试设置所有权和文件模式位
  • install -d 不会尝试设置所有权和文件模式位

这是mkdirinstall来自GNU的coreutils。它们都使用相同的make_dir_parents功能,但preserve_existing参数分别设置为falsetrue


1
有用的差异化!
维克多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.