Странный behavour которого в сценарии оболочки, запущенном как разветвленный процесс

Таким образом, у меня есть процесс 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... все работает

0
задан 18 July 2014 в 15:56
1 ответ

Так что я нашел решение этой проблемы....

Так что в основном в том, как мой 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`"

Тогда все это начало работать

Записывая это для потомков, так как потребовалось некоторое время, чтобы проследить первопричину до моей собственной глупости (что было по уважительной причине в другом месте кода)

.
0
ответ дан 5 December 2019 в 13:40

Теги

Похожие вопросы