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

Nea*_*iel 79 utilities software-installation file-copy

我在很多地方都看到过用于install -d创建目录和install -c复制文件。为什么不使用mkdircp?使用上有优势install吗?

小智 69

这取决于你在做什么。

install命令通常用于随包和源代码一起提供的安装脚本,用于将二进制文件安装到您的系统。它还可用于安装任何其他文件或目录。除了用于指定要安装的文件的新权限的-d-c选项外-m,您不必执行 acp和 achmod即可获得相同的结果。例如:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"
Run Code Online (Sandbox Code Playgroud)

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

有关参考,请参阅man install。对于使用,只需查看一些包源代码附带的任何安装脚本。


Net*_*tch 26

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

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

因此,它遵循 Unix 方法,即应该为将某个构建工具制作的文件安装到其工作位置的单一但完整的操作而制作工具。

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

  • 在 makefile 中使用 `install` 或 `$(INSTALL)` 也将这些步骤标记为安装复制步骤而不是一些普通的复制步骤。那可能很有用。 (2认同)

Tom*_*äre 19

除了前面关于用法的描述外,cp和之间存在低级差异install,至少在 Linux 上是这样。如果复制现有文件,则cp覆盖文件的现有 inode,同时install始终为相同的文件名创建新的 inode。

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

  • @NeaţuOvidiuGabriel 是的。对于用户来说,将只有一个文件,因为文件通常是按名称查找的。但是对于文件系统来说,只要某个进程持有对旧文件的引用,就有两个文件。如果重命名或删除进程打开的文件,然后创建一个具有相同文件名的新文件,也可以实现相同的效果。 (2认同)

Ale*_*der 5

如果有问题的目录已经存在:

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

这是为了installmkdir来自GNU coreutils

它们都使用相同的make_dir_parents函数,但preserve_existing参数设置为:

  • true 为了 install -d
  • false 为了 mkdir -p

  • 有用的区分! (3认同)