`sudo su -l -c "echo $PATH"`にJavaバイナリの場所が表示されますが、 `sudo su -l -c "java"`が機能しないのはなぜですか? [コピー]

`sudo su -l -c "echo $PATH"`にJavaバイナリの場所が表示されますが、 `sudo su -l -c "java"`が機能しないのはなぜですか? [コピー]

次のように、カスタムロケーションのtarballにJavaバイナリを含むサーバーがあります/etc/bash.bashrc

export JAVA_HOME=/path/to/java/home
export PATH=$JAVA_HOME/bin:$PATH

実行するsudo su -l -c "java"-su: java: command not found。ところがsudo su -l直接入るとエラーなく実行になりますjava

さらに、sudo su -l -c "echo $PATH場所も含まれていますjava

sudo su -l -c "java"実行が失敗したのはなぜですか?

編集:そう/etc/bash.bashrcでない場合でも、~/.bashrcリンクされた質問/回答に同じ推論が適用されます。

答え1

を実行すると、sudo su -l -c "echo $PATH"二重$PATH引用符によって拡張が防止されないため、元のシェルで拡張が発生します。シェルsudo su -l -c 'echo $PATH'で拡張を実行しようとしていますsu

その後の質問は「javaこれをどのように実行しますか?」になると仮定します。フルパスを使用してjavaを呼び出すか、正しいrcファイル(例えばsu -c '. /etc/bash.bashrc; java ...'

答え2

dhagは$PATH正確ではないにもかかわらず、正しいように見える理由を説明します。

パスが変更されない理由は、suシェルが対話式に実行されないためである可能性が高いです。これは、bash.bashrcが最初に実行されていないか実行されていないことを検出し、何も実行する前に終了することを意味します。インタラクティブに。

コマンド名の代わりにフルパスを指定するか、デフォルトパスが設定されている場所を見つけて変更する必要があります。

関連情報