Как найти все интерактивные команды в сценарии оболочки, используя Java? - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу написать функцию java, которая будет сканировать файл bash и определять, есть ли какие-либо команды, требующие ввода пользователем.Я знаю, что есть команда read, предназначенная для ввода пользовательского ввода, и я думаю, что она единственная.

Я написал класс Validator, который принимает скрипт (простой класс, который просто загружает содержимоескрипт для строковой переменной, использующий Files.readAllBytes(Paths.get(path))).

Вот мой класс Validator:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class Validator {

    Script script;

    String[] interactiveCommands = {"read"};

    public Validator(Script script) {
        this.script = script;
    }

    public void validateInteractiveCommands() {
        for (String string : interactiveCommands) {
            streamService(string);
        }
    }

    private void streamService(String string) {
        try (Stream<String> stream = Files.lines(Paths.get(script.getPath()))) {
            stream.filter(lines -> lines.startsWith(string))
                    .forEach(this::printFound);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void printFound(String string) {
        System.out.println("Found an interactive command: " + string);
    }

}

Но в этом случае я фиксирую чтение только тогда, когда оно находится в начале строки,И в этом случае:

if true ; then
    read a
fi

не удается захватить чтение из-за 4 пробелов.Есть ли какой-нибудь простой способ, которым я могу справиться с этим, используя поток или лямбду?Или я должен переключиться на регулярное выражение?

1 Ответ

0 голосов
/ 22 ноября 2018

"Я знаю, что есть команда чтения, предназначенная для ввода пользовательского ввода, и я думаю, что она единственная."

На самом деле, невозможно сказать,команда в сценарии оболочки собирается захватить ввод пользователя.Вот несколько примеров:

  rm -i *
  cat > file

Действительно, (вообще) невозможно сказать, какие команды могут быть выполнены скриптом оболочки.Например:

  #!/bin/sh
  echo running "$@"
  "$@"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...