rpm的pretrans,%pre等等.scriptlet部分似乎不支持/ bin / sh

时间:2015-10-08 01:11:51

标签: rpm rpmbuild

rpm%pretrans,%pre,%post等等。scriptlet部分不支持所有/ bin / sh吗?

%pretrans
[ -n "$VERBOSE" ] && echo "pretrans called with argument \`$1'" >&2
[ -n "$VERBOSE" ] && set -x

%preun

以上在安装rpm时出现以下错误

# rpm -i dist/mapr-bogus-0.0.0-1.noarch.rpm 
error: %pretrans(mapr-bogus-0.0.0-1.noarch) scriptlet failed, exit status 1

如果我添加" echo你好"在条件语句下,rpm安装没有错误。是否存在关于rpm scriptlet中的短路条件的规则?

bash-4.1# rpmbuild --version
RPM version 4.8.0
bash-4.1# lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.1 (Final)
Release:    6.1
Codename:   Final

2 个答案:

答案 0 :(得分:2)

当最后一个命令失败时,

RPM scriptlet失败(作为每个shell脚本)。当'$ VERBOSE'为空时,'['返回1:

<select>
  <option value="10">10></option>
  <option value="5">5></option>
  <option value="0">Select</option>
  <option value="-5">-5></option>
  <option value="-10">-10></option>
</select>

因为你使用&amp;&amp;没有别的执行。所以最后一个命令退出状态码为1,因此整个scriptlet以状态码1结束。这个RPM评估该scriptlet失败。

正确的解决方案可以是:

$ [ -n "$VERBOSE" ]
$ echo $?
1

其中':'是'true'的常见别名。

答案 1 :(得分:0)

@ msuchy回答的补充:

另一种以“正确”方式抑制错误的方法,如果你在“set -e”下运行,也会起作用,就是反转测试,所以它总是如此:

[ -z "$VERBOSE" ] || echo "thingywhatsit"

如果$ VERBOSE为空,则第一次测试为真,并且不运行回声。如果它是假的,它将运行回声,并且只有当echo返回错误时才会出错。这正是你想要的。

请记住,在“if”语句之类的内容中不会触发失败:$?为0,除非“then”或“else”块中的某些内容产生错误。