Запуск скрипта Bash с использованием Java - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь запустить скрипт Bash, чтобы сравнить два файла, чтобы увидеть, идентичны ли они (за исключением последних нескольких строк). Сценарий, который я написал, работает нормально, когда я запускаю его вручную, однако, потому что я хочу, чтобы скрипт запускался сразу после программы java, я сделал так, чтобы программа java запускала сценарий после того, как она сделала все остальное, но когда это происходит, я получаю синтаксическую ошибку.

Может кто-нибудь объяснить, почему это происходит, когда я запускаю скрипт bash из программы java и как я мог это исправить.

fileChangeCheck. sh

#!/bin/bash

if [[ -f output/newfile.json ]]
then

echo "File found"
errorTest=$(tail -n 1 output/newfile.json)

if [[ $errortest=} ]]
then

diff <(head -n -3 output/current.json) <(head -n -3 output/newfile.json) > output/check.txt

if [[ -s output/check.txt ]]
then
  echo "$(date "+%d-%m-%Y %H:%M:%S") - Check had Data" >> logs/log.txt
  mv output/current.json output/archive/current.$(date "+%Y%m%d%H%M%S").json
  mv output/newfile.json output/current.json
  rm output/check.txt
else
  echo "$(date "+%d-%m-%Y %H:%M:%S") - Check was empty" >> logs/log.txt
  rm output/newfile.json
  rm output/check.txt
fi
fi
fi

Java код

    public static void filecheck() throws Exception {
        Process p = Runtime.getRuntime().exec("sh "+directory+"fileChangeCheck.sh");
        p.waitFor();

        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));


        String line = "";
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        line = "";
        while ((line = errorReader.readLine()) != null) {
            System.out.println(line);
        }
    }

Сообщение об ошибке

$ java -jar retrieve.jar
fileChangeCheck.sh: line 12: syntax error near unexpected token `('
fileChangeCheck.sh: line 12: `diff <(head -n -3 output/current.json) <(head -n -3 output/newfile.json) > output/check.txt'

Большое спасибо

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Вы вызываете sh, который просто запустит этот скрипт; верхний «комментарий», который указывает системе запускать его с bash, игнорируется sh, а sh может не быть bash, так что это то, на что стоит обратить внимание. Это также довольно сомнительно и может привести к сбою во многих системах; Я бы посоветовал явно вызывать '/ bin / bash' как минимум.

Это, скорее всего, исправит это. Если нет, возможно, проблема в том, что текущий рабочий каталог отличается.

РЕДАКТИРОВАТЬ: Применимо предложение комментатора Дейва Томпсона.

0 голосов
/ 11 февраля 2020

Processbuilder имеет много опций, которые вы можете установить:

try {
        final Process pr = new ProcessBuilder("fileChangeCheck.sh").directory(new File(yourDirectory)).redirectOutput(new File(logfile))
                        .start();
        pr.waitFor();
    } catch (IOException | InterruptedException e) {
        System.out.println(e.getMessage());
    }
...