4

コンピューターで何か奇妙なことが起こった。/ usr / local/binの下にgperfをインストールしました。私がここで尋ねた質問に関連して、私は自分のコンピューターで実行されているperlスクリプトを持っていました。これには、次のようなフラグを持つgperfの行system()が含まれています。

perlファイル:

system("gperf ...") == 0 || die "calling gperf failed: $?";

ただし、どんなに頑張ってもgperfは実行されず、失敗したメッセージが出力されません。

デバッグするために私は次のようなものを試しました

system("echo \$PATH") == 0 || die "calling gperf failed: $?";

gperfをインストールした場所は含まれていませんが、インストールされていない場所/usr/local/bin/のみを調べていることがわかりましたusr/bin

だから$PATH間違っている...だから私はグーグルで見system()て、ファイル内で/ bin / shを呼び出すのと同じであると思ったので、試し/bin/shて みたところ、信じecho $PATHられないほど含まれていることがわかりました。/usr/local/bin/だから私の質問は、system()の$PATHがどこで宣言されているのかということです。なぜボーンシェル内のものと違うのですか?

4

2 に答える 2

7

PATHを介して起動されたコマンドによって使用されるコマンドは、perlスクリプトのコマンドsystemと同じであり、を介してアクセスできます$ENV{PATH}PATHスクリプトで変更しない限り、perlスクリプトはそれを呼び出したプログラムから継承します。

あなたを苦しめているのは、おそらくあなたがPATH間違った設定ファイルであなたを設定したことです。などのシェル構成ファイルではなく~/.profile、または他のシステム全体のファイルで定義します。一般的な情報については、この質問を参照してください。/etc/profile.bashrc

perlスクリプト内でパスを手動で設定する場合は、次のようなものを使用できます。

$ENV{PATH} = "/usr/local/bin:$ENV{PATH}" unless ":$ENV{PATH}:" =~ m~:/usr/local/bin:~;

しかし、これはおそらく悪い考えです。ほとんどの場合、スクリプトは、そのスクリプトを実行するユーザーが選択したパスを変更しないでください。

PATH私がリンクした質問とそこにある私の回答にリンクされている質問を読んだ後、システムに設定する適切な場所を見つけるのに問題がある場合は、 UnixとLinuxで質問し、オペレーティングシステムの詳細(配布、バージョンなど)およびログイン方法(これはユーザーの質問であり、プログラミングの質問ではありません)。

于 2012-08-29T23:51:58.787 に答える
0

シェルとしてBASHを使用するLinuxシステムでは、PATHは、ログイン時にユーザーのホームディレクトリにある.bash_profileファイルから設定されます。/ usr / local / binディレクトリに、ファイルの最後に次のような行を追加できます。

    PATH=$PATH:/usr/local/bin

これを修正するもう1つの(おそらくより信頼性の高い)方法は、次のように、システムコールで絶対パスを使用することです。

    system("/usr/local/bin/gperf")
于 2012-08-29T23:47:51.567 に答える