0

我们的用户编写了一个 shell 脚本来将应用程序复制到 OSX 上的 /Applications 文件夹中。第一次效果很好,但第二次出现错误。这是一个新的开发,在我们更改应用名称之前它显然可以正常工作。

shell 脚本运行以下命令:

cp -a ApplicationName.app /Applications
open -a '/Applications/ApplicationName.app/Contents/MacOS/ApplicationName' --args -LSRC autolaunch

第一次运行时,它运行良好,应用程序被复制过来,然后启动。第二次返回时出现以下错误

[jrivera@chamomile] $ sudo ./InstallScript.sh /SRNM ABC1234567
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Headers with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Headers
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Resources with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Resources
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/pt.lproj with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/pt.lproj
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/Current with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/Current

我不确定为什么会这样。它是完全相同的脚本在完全相同的位置复制完全相同的东西,相隔 30 秒。我深入研究了每个目录和文件,它们都显示完全相同的文件类型。我尝试将其他命令添加到 cp 以强制执行它(-RfXv),但得到了同样的结果。有任何想法吗?也许这是闪闪发光的奇怪东西?

4

1 回答 1

2

我怀疑有问题的文件/目录具有一些扩展属性,并且cp当它具有这些属性时覆盖目标时会出现问题。(cp当保留权限在不同平台上通常看起来不可靠时)。

鉴于此,有几个解决方法可供探索:

  • /Applications/ApplicationName.app在重新复制之前删除目标。
  • 使用rsync,例如,

    rsync -vaz ApplicationName.app/ /Applications/ApplicationName.app

在您更新目标时,先删除目标可能会干扰使用它的人;rsync以增量方式工作(并且几乎总是比 更新更快cp)。

于 2015-05-21T20:39:43.793 回答