shell脚本出错

时间:2012-06-06 15:08:13

标签: qt shell install-name-tool

我正在使用shell脚本来帮助我解析库路径,以便我可以发送我的应用包。我不太了解shell脚本,并且从其他部分一起黑客攻击,所以我真的不知道如何解决这个问题。问题围绕done << ...

这样的行

这是一些代码!请注意,这是基于Qt项目。

echo "Below is the list of install_name_tools that need to be added:"
while IFS= read -r -d '' file; do
    baseName=`basename "$file"`
    #echo "otool -L \"$file\" | grep -e \"*$baseName\""
    hasUsrLocal=`otool -L "$file" | grep -v -e "*$baseName" | grep -v libgcc_s.1.dylib | grep -v libstdc++.6.dylib | grep "/usr/local\|/Users"`
    if [ -n "$hasUsrLocal" ]; then
        #echo "WARNING: $file has /usr/local dependencies"
        #echo "\"$hasUsrLocal\""

        #echo "To Fix:"

        while read line; do
            #Remove extra info
            library=`echo "$line" | perl -pe 's/(.*?)\s\(compatibility version.*/\1/'`
            libraryBaseName=`basename "$library"`
            frameworkNameBase="$libraryBaseName.framework"
            isframework=`echo "$library" | grep "$frameworkNameBase"`

            unset fixCommand;
            if [ -n "$isframework" ]; then
                #Print out how to fix the framework
                frameworkName=`echo $library | perl -pe "s/.*?($frameworkNameBase\/.+)/\1/"`
                fixCommand=`echo "install_name_tool -change \"$library\" \"@executable_path/../Frameworks/$frameworkName\" \"$file\""`
            else
                #Print out how to fix the regular dylib
                if [ "$baseName" != "$libraryBaseName" ]; then
                    fixCommand=`echo "install_name_tool -change \"$library\" \"@executable_path/../Frameworks/$libraryBaseName\" \"$file\""`
                fi
            fi

            echo "$fixCommand"
        done << (echo "$hasUsrLocal")
        #echo "---------------------------------------------------------"
    fi

done << (find MyProgram.app -type f -print0)

此处打印的错误是指行done << (echo "$hasUsrLocal")

./deploy.sh: line 563: syntax error near unexpected token `('
./deploy.sh: line 563: `        done << (echo "$hasUsrLocal")'

如果我注释掉一些脚本,我也会得到done << (find MyProgram.app -type f -print0)的类似问题。谢谢!

3 个答案:

答案 0 :(得分:1)

我认为作者打算使用流程替换:

done < <( find ...

你也可以尝试将find发布到while循环中:

find MyProgram ... | while IFS= read -r -d '' file; do ... done

答案 1 :(得分:0)

我修好了!感谢William Pursell提供关键字“流程替代”。这给了我“谷歌”的基础。

我注意到这是间距问题。例如,需要像done < <(echo "$hasUsrLocal")那样间隔开来!

答案 2 :(得分:0)

答案

<<符号用于here-documents。你可能想要的是重定向过程替换:

< <( : )

<(command_list)构造用于process substitution,而第一个小于符号将循环的标准输入重定向到由该行后面的进程替换创建的文件描述符。

专业提示

这是一种方便但令人困惑的语法。从右到左阅读它确实很有帮助。