次のように、カスタムロケーションの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が最初に実行されていないか実行されていないことを検出し、何も実行する前に終了することを意味します。インタラクティブに。
コマンド名の代わりにフルパスを指定するか、デフォルトパスが設定されている場所を見つけて変更する必要があります。