我在packagemaker使用预检bash脚本:
run cp -pf "/folder/to/my/db" "/Library/Application Support/app/db
run函数(即我StackOverflow上发现的方式):
run() { $*; code=$?; [ $code -ne 0 ] && echo "command [$*] failed with error code $code\nERROR: $@\n"; }
该命令cp
返回64的代码。 这是什么64周的状态吗? 我该如何解决?
问题是,你没有一个文件夹Support/app/db
的命令复制文件/folder/to/my/db
和/Library/Application
来。
更换误导(几乎总是错的) $*
用正确的"$@"
:
run()
{
"$@"
code=$?
[ $code -ne 0 ] && echo "command [$*] failed with error code $code\nERROR: $@\n"
}
普通$*
在空间打破字; "$@"
保存在参数空间。 大多数情况下, $*
是不是正确的符号(尽管它会在被罚款echo
,你使用$@
)。 为什么命令的参数在错误信息被列出了两次,是我不清楚。
错误报告将通过添加可提高>&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重定向一个单元而无需启动子壳。
另请参阅如何循环参数在bash脚本 。