0

I'm using a shell script to help me resolve library paths so I can send out my app bundle. I don't know much about shell scripts and was hacking something together from other pieces so I really don't know how to resolve the issue. The issue revolves around lines like done << ...

Here's some code! Note, this is based off of a Qt project.

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)

The error this prints is referring to the line done << (echo "$hasUsrLocal")

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

I'll get a similar issue for done << (find MyProgram.app -type f -print0) too if I comment out some of the script. Thank you!

4

3 に答える 3

1

著者はプロセス置換を使用するつもりだったと思います。

done < <( find ...

検索結果をwhileループにパイプすることもできます。

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

それを私が直した!「プロセス置換」というキーワードを提供してくれた William Pursell に感謝します。それが私に「Google」への土台を与えました。

間隔の問題であることに気付きました。done < <(echo "$hasUsrLocal")たとえば、間隔をあける必要があります。

于 2012-06-06T15:18:05.890 に答える
0

答え

シンボルは<<ヒアドキュメント用です。おそらく必要なのは、リダイレクトされたプロセス置換です。

< <( : )

<(command_list)コンストラクトはプロセス置換用ですが、最初の小なり記号は、ループの標準入力を、行でそれに続くプロセス置換によって作成されたファイル記述子にリダイレクトします。

プロのヒント

これは便利ですが、紛らわしい構文です。右から左に読んでいただけると助かります。

于 2012-06-06T15:18:47.387 に答える