我最近被我的 Bash 脚本中的一个错误行为所困扰,我想知道:
- 这是预期的系统行为吗,还是一个错误?
- 理想的解决方法是什么
本质上,问题归结为以下几点。首先,我有一个现有的目录结构,其布局如下。
/opt/dir/file.a
/opt/dir/file.b
/opt/dir/file
其中file
硬链接到file.a
。我想用一个根据参数选择或file
选择的 shell 脚本来替换,因此我运行了如下脚本:file.a
file.b
cp my_file /opt/dir/file
问题在于,由于file
是到的硬链接file.a
(意味着这两个文件实际上只是同一 inode 的两个名称),因此更改会反映在和下file
。file.a
这是明显地这不是我想要的。
看来该cp
命令实际上是/opt/dir/file
使用截断文件标志打开的,例如:fopen("file", "w+")
。并写入它。我原本以为它会破坏硬链接,因为我正在复制新的以该名称命名的文件。
这是 的正确和预期行为cp
吗?这对我来说似乎不直观。当我将文件从一个位置复制到另一个位置时,我心里想的是替换它,而不是重写它。是否有 的标志可以避免cp
这种情况?我目前的解决方法是rm /opt/dir/file && cp my_file /opt/dir/file
。
查看手册页出现这cp --remove-destination my_file /opt/dir/file
可能是正确的解决方案,但我仍然对大家对这个问题的看法感兴趣。
答案1
您所描述的是 的正确行为cp
,而不是错误。考虑到您想要的结果,您对脚本所做的修改(rm
后跟cp
)听起来是正确的方法。