如何使用Java在Shell脚本中查找所有交互式命令?

时间:2018-11-22 07:28:47

标签: java string bash lambda find

我想编写一个Java函数,它将扫描bash文件并查找是否有需要用户输入的命令。我知道有一个命令read用于捕获用户输入,我认为这是唯一的命令。

我编写了一个Validator类,该类带有一个脚本(一个简单的类,它使用Files.readAllBytes(Paths.get(path))将脚本的内容加载到String变量中。)

这是我的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

由于有四个空格,因此无法捕获读取。 有什么简单的方法可以使用流或lambda处理它?还是应该切换到regexp?

1 个答案:

答案 0 :(得分:3)

  

“我知道有一条命令可以读取用户输入,我认为这是唯一的一条命令。”

实际上,无法确定Shell脚本中的命令是否要捕获用户输入。以下是一些示例:

  rm -i *
  cat > file

实际上,(通常)无法确定shell脚本可能执行的命令 。例如:

  #!/bin/sh
  echo running "$@"
  "$@"