cp以64错误状态退出

时间:2014-09-11 14:54:22

标签: bash packagemaker

我在 packagemaker

中使用了预检bash脚本

run cp -pf "/folder/to/my/db" "/Library/Application Support/app/db

运行函数(顺便说一句,我在StackOverflow上找到):

run() { $*; code=$?; [ $code -ne 0 ] && echo "command [$*] failed with error code $code\nERROR: $@\n"; }

命令cp返回64代码。请问64这个状态是什么? 我该如何解决?

1 个答案:

答案 0 :(得分:3)

问题是您没有文件夹Support/app/db来命令将文件/folder/to/my/db/Library/Application复制到。

使用正确的$*替换被误导的(几乎总是错误的)"$@"

run()
{
    "$@"
    code=$?
    [ $code -ne 0 ] && echo "command [$*] failed with error code $code\nERROR: $@\n"
}

普通$*在空格处打破单词; "$@"在参数中保留空格。大多数情况下,$*不是正确的符号(尽管在您使用echo的{​​{1}}中会很好)。我不清楚为什么命令的参数在错误消息中被列出两次。


通过在末尾添加$@来将输出重定向到标准错误(错误消息所属的位置),可以改进错误报告。 (我在删除重复时删除了重复项。)请注意,在>&2的参数中使用$*是完全合适的。

echo

事实上, [ $code -ne 0 ] && echo "command [$*] failed with error code $code" >&2 功能可以更加简化;实际上不需要变量run()

code

如果您希望脚本也退出,则可以使用:

run()
{
    "$@" || echo "command [$*] failed with error code $?" >&2
}

run() { "$@" || { echo "command [$*] failed with error code $?" >&2; exit 1; } } 表示法将命令视为I / O重定向的一个单元,而不启动子shell。


另见How to iterate over arguments in a Bash script