我在 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这个状态是什么?
我该如何解决?
答案 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。