我已经在很多地方看到过用来install -d
创建目录和install -c
复制文件的地方。为什么不使用mkdir
和cp
?使用有优势install
吗?
我已经在很多地方看到过用来install -d
创建目录和install -c
复制文件的地方。为什么不使用mkdir
和cp
?使用有优势install
吗?
Answers:
这取决于您在做什么。
该install
命令通常在软件包和源代码附带的安装脚本中使用,以将二进制文件安装到系统中。它也可以用于安装任何其他文件或目录。除了-d
和-c
选项之外,您还-m
可以指定要安装的文件的新权限,因此不必进行cp
和chmod
即可获得相同的结果。例如:
install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"
您还可以选择-g
并-o
分别设定的目标群体和所有者。这样可以避免单独调用chown
。通常,通过使用install
一个命令(而不是多个命令)执行文件创建,复制,模式设置和相关操作,使用可以缩短脚本并使脚本更简洁。
供参考,请参阅man install
。对于用法,只需看一下一些软件包源代码附带的任何安装脚本。
“安装”通常结合以下操作:
因此,遵循Unix的方法,即应为安装某个构建工具生成的文件到其工作位置的单个但完整的动作创建工具。
我所描述的完整概念是在BSD系统中实现的(所谓的“ xinstall”版本)。为此,我将“安全复制”模式(具有原子重命名的新版本)视为至关重要。Linux系统(来自coreutils)错过了这一重要部分,并且易于在旁观者进程删除和重新打开之间进行竞争。但这可能已经由包管理器解决了。
除了此处有关用法的先前描述之外,cp
和install
至少在Linux上的区别很小。如果复制现有文件,cp
则将覆盖文件的现有inode,同时install
始终为相同文件名创建一个新inode。
这在安装运行二进制文件的新版本时会有所不同。使用cp
会导致EBUSY错误,而install
会成功。正在运行的二进制文件仍将使用旧版本,但是如果程序重新启动,将使用新版本。
如果问题目录已经存在:
mkdir -p
将尝试设置所有权和文件模式位install -d
不会尝试设置所有权和文件模式位这是mkdir
和install
来自GNU的coreutils。它们都使用相同的make_dir_parents
功能,但preserve_existing
参数分别设置为false
或true
。
install
或$(INSTALL)
在makefile中还将这些步骤标记为安装复制步骤,而不是某些常规复制步骤。那可能很有用。