0

我正在使用 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)如果我注释掉一些脚本,我也会遇到类似的问题。谢谢!

4

3 回答 3

1

我相信作者打算使用流程替换:

done < <( find ...

您也可以尝试将 find 传递到 while 循环中:

find MyProgram ... | while IFS= read -r -d '' file; do ... done
于 2012-06-06T15:11:01.127 回答
0

我修好了它!感谢 William Pursell 提出的关键字“过程替换”。这让我有了“谷歌”的基础。

我注意到这是一个间距问题。需要间隔done < <(echo "$hasUsrLocal"),例如!

于 2012-06-06T15:18:05.890 回答
0

回答

<<符号用于此处的文档。您可能想要的是重定向进程替换:

< <( : )

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

专家提示

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

于 2012-06-06T15:18:47.387 回答