Таким образом, у меня есть процесс Java, который делает некоторую автоматизацию. Одной из вещей, которые это должно сделать, является находка JDK домой на случайных машинах.
Таким образом, я записал сценарий оболочки, чтобы попытаться найти JDK, домой принимающий это javac
находится на пути.
При тестировании этого сценария оболочки локально я столкнулся с некоторым довольно странным behavour, который я хотел бы понять.
Странное поведение сводится к which
команда, ведущая себя скорее странно. Отрывок сценария, который я затрудняюсь объяснять, запускается с
#/bin/sh
...
if [ -z "$JAVA_HOME" ]; then
javac -version
which javac || echo "rv=$?"
javaExecutable="`which javac`"
...
(Я добавил javac -version
и which javac || echo "rv=$?"
только для проверки у меня был допустимый ПУТЬ в разветвленном процессе),
Если я использую sh -x
для запуска разветвленного процесса затем, я получаю следующий вывод:
+ '[' -z '' ']'
+ javac -version
javac 1.8.0_11
+ which javac
+ echo rv=1
rv=1
++ which javac
+ javaExecutable=
Если я заменяю which
со следующей функцией
_which() {
oldIFS="$IFS"
IFS=':'
for p in $PATH
do
if [ -x "$p/$1" ]; then
echo "$p/$1"
IFS="$oldIFS"
return 0
fi
done
IFS="$oldIFS"
return 1
}
Затем все работает, как я ожидал бы.
Если я вызываю свой исходный сценарий из командной строки, непосредственно... все работает
Если я вызываю свой исходный сценарий через ssh localhost sh -x PathToScript
... все работает
Так что я нашел решение этой проблемы....
Так что в основном в том, как мой Java-процесс запускал скрипт, я частично виноват... а также в какой-то другой странности.
Мой Java-процесс очищал окружающую среду, чтобы получить что-то "вменяемое"...
Итак, Java код выглядит как
ProcessBuilder p = new ProcessBuilder(new String[]{
"sh",
"-x",
"pathToScript.sh"
}).redirectErrorStream(
true).redirectOutput(ProcessBuilder.Redirect.INHERIT);
p.environment().clear();
p.start();
Итак, что случилось бы, так это то, что sh
построил бы его PATH
локально, но не экспортировал бы его.
Когда я изменил свой скрипт с
javaExecutable="`which javac`"
на
export PATH
javaExecutable="`which javac`"
или
javaExecutable="`PATH="$PATH" which javac`"
Тогда все это начало работать
Записывая это для потомков, так как потребовалось некоторое время, чтобы проследить первопричину до моей собственной глупости (что было по уважительной причине в другом месте кода)
.