如何在rpm spec文件中调用带参数的函数?

时间:2016-04-14 17:33:55

标签: python linux bash rpm specfiles

我正在构建一个rpm来在我的机器上安装组件,但是我想检查是否已经安装了某些python库,以免不必要地重新安装它们。所以,在我的spec文件的%post部分,我正在这样做:

function check4pythonlib() {
    library=$1
    if [[ $(/usr/local/bin/python2.7 -c "import $library" 2> /dev/null ; echo $?) -eq 0 ]]; then
        echo "$library is installed"
    else
        echo "$library is not installed"
        echo "Installing $library..."
        cd /path/to/lib/$library
        /usr/local/bin/python2.7 setup.py build
        /usr/local/bin/python2.7 setup.py install
    fi
}

check4pythonlib pythonlib1
check4pythonlib pythonlib2

我正在将所有输出写入日志文件,我看到了:

 is not installed
Installing ...
/usr/local/bin/python2.7: can't open file 'setup.py': [Errno 2] No such file or directory
/usr/local/bin/python2.7: can't open file 'setup.py': [Errno 2] No such file or directory
 is not installed
Installing ...
/usr/local/bin/python2.7: can't open file 'setup.py': [Errno 2] No such file or directory
/usr/local/bin/python2.7: can't open file 'setup.py': [Errno 2] No such file or directory

似乎参数没有被传递给函数。我也尝试用双引号括起参数,但它也不起作用。如何在rpm安装期间正确传递参数,以便这样做?

1 个答案:

答案 0 :(得分:0)

所以,我注意到当Etan Reisner建议使用set -vx运行spec文件的那一部分时,会出现一些奇怪的结果......输出看起来像这样:

function check4pythonlib() {
    library=pythonlib1
    if [[ $(/usr/local/bin/python2.7 -c "import " 2> /dev/null ; echo $?) ]]; then
        echo " is installed"
    else
        echo " is not installed"
        echo "Installing ..."
        cd /path/to/lib/
        /usr/local/bin/python2.7 setup.py build
        /usr/local/bin/python2.7 setup.py install
    fi
}

很明显,参数pythonlib1正在函数内部进行,但由于某种原因,我无法看到我将其赋给的变量(在本例中为$library)。

所以这就是我最终做的事情:

function check4pythonlib() {
    if [[ $(/usr/local/bin/python2.7 -c "import $1" 2> /dev/null ; echo $?) ]]; then
        echo "$1 is installed"
    else
        echo "$1 is not installed"
        echo "Installing $1..."
        cd /path/to/lib/$1
        /usr/local/bin/python2.7 setup.py build
        /usr/local/bin/python2.7 setup.py install
    fi
}

我直接用参数替换变量$library,在本例中为$1。很脏,但现在它有效。现在我只需要弄清楚为什么变量在spec文件中使用时似乎消失了......