このスクリプトが「実行できない」四半期に停止しているのはなぜですか?

このスクリプトが「実行できない」四半期に停止しているのはなぜですか?

私はコントロールパネルメーカーが提供するこのツールを使用しています。

手順に沿って手順に従いましたが、サンプルコードをコンパイルしようとすると、if句の「$ basenameを実行できません」ブランチでコンパイルプロセスが中断されました。

私はbashスクリプトのウィザードではないので、私が何を見ているのかわかりません。

#!/bin/bash

# uclibc-toolchain-wrapper




basename=$0

if [ -d $basename ]
then
    echo "This can't be a directory."
    exit 1;
fi

tool_name=${basename##*/}
if [[ $tool_name =~ "mips-linux-uclibc-gnu" ]]
then
    prefix=${basename%-uclibc-*}
    postfix=${basename##*mips-linux-uclibc}
    $prefix$postfix "-muclibc" $@
else
    echo "$basename can't execute."
    exit 1;
fi

では、このスクリプトをローリングするにはどうすればよいですか?

ユーザーマニュアルには、ツールチェーンを「インストール」するために環境変数を変更するように指示されています。これには、デフォルトで.bashrcの「PATH」変数に指定されたパスを追加することが含まれます。もちろん、ツールチェーン全体を指定されたフォルダに配置しました。

ソースフォルダに「make」コマンドを入力すると、ツールチェーンが呼び出されるように見えますが、「uclibc-toolchain-wrapperを実行できません」エラーが印刷されると、このスクリプトで実行が停止します。ここで、「uclibc-toolchain-wrapper」はスクリプトのファイル名です。

私はlubuntu 13、ubuntu 22、Debian 5で試してみましたが、すべて同じ結果を得ました。

助けてください!よろしくお願いします!

ベストアンサー1

スクリプトの先頭で、「このスクリプトが実行される名前(ディレクトリパスを含む)」$basenameと同じに設定します。$0

cc1-mips-linux-uclibc-gnuこのスクリプトの明白な目的は、コンパイラの最初のステップなど、さまざまな名前にリンク/コピーすることです。その名前で実行されたら、コマンドを並べ替えてcc1-mips-linux-gnu -muclibc <script parameters>実行しようとします。

これにより、ツールチェーンパッケージには、次の名前の複数の実行可能なツールが含まれる可能性があります。

<tool name>-mips-linux-gnu<possible suffix>

このラッパーは次のように接続できます。

<tool name>-mips-linux-uclibc-gnu<possible suffix>

各ツールには、部品を含む長い形式のツール名が許可されています-uclibc-

ls -lFツールチェーン実行可能ファイルを含むディレクトリで実行している場合は、次のシンボリックリンクが表示されることがあります。

cc1-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<some tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<another tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
...

また、同じディレクトリまたはツールチェーンパッケージの他の場所には、次の名前の実行可能ファイルがあります。

cc1-mips-linux-gnu
<some tool>-mips-linux-gnu
<another tool>-mips-linux-gnu
...

etc.などは、よく知られているコンパイラ/リンカコンポーネント名または<some tool>他のツールです。<another tool>cppld


ただし、実行時に受信される文字通りのエラーメッセージが次のようなmake場合

uclibc-toolchain-wrapper can't execute

さて、スクリプトは単に実行されていることを検出しますuclibc-toolchain-wrapper。これは間違っています。スクリプトは、文字列を含むすべての名前で呼び出されると予想しますmips-linux-uclibc-gnu。これは実際に失敗した場合は「$basenameを実行できません」エラーメッセージを生成するテストです。

ツールチェーンパッケージをUnixファミリーではなくファイルシステム(NTFSなど)に抽出し、そこで実行してみましたか?これらのファイルシステムでは、シンボリックリンクセマンティクスはUnixファミリーファイルシステムとは異なる動作をする可能性があります。これは、スクリプトがスクリプトを実行するために使用されたシンボリックリンクの元の名前を取得できず、代わりにuclibc-toolchain-wrapperscript()の実際の名前を取得する理由を説明できます。この場合の修正方法は、ツールチェーンパッケージを実際のUnixファミリーファイルシステムに再抽出してそこで使用することです。

あるいは、Makefileが実際に名前を使用してスクリプトを呼び出す場合、uclibc-toolchain-wrapperMakefileは愚かな、または何らかの方法で誤って設定されています。

おすすめ記事