Собственные команды gogoshell

Я пытаюсь использовать gogo-shell для добавления некоторых консольных команд. Например, я создаю команды add и show.

public void add(CommandSession commandSession, int i) {
    List<Integer> il = commandSession.get("list");
    if (il == null) {
        il = new ArrayList<Integer>();
        il.add(i);
        commandSession.put("list",il)
    } else {
        il.add(i)
    }
}
public void show(CommandSession commandSession) {
    List<Integer> il = commandSession.get("list");
    il.foreach(System.out::println);
}

и когда я использую их как

add 1 | add 2 | add 3 | add 4 | show

Я получаю что-то вроде

null pointer Exception

или же

1
3
4
2

Я думаю, что это происходит потому, что каналы (добавить) работает параллельно. Так как я могу написать команду, где трубопровод будет последовательным.

1 ответ

Решение

Конвейеры в gogo (как в bash) ожидают, что они будут использовать данные из стандартного ввода и выдают данные в стандартном выводе. Каждый элемент в конвейере запускается одновременно как отдельный поток.

Команда 'add' в вашем примере не использует и не генерирует данные о стандартных входах / выходах и поэтому не подходит для запуска в конвейере.

Если вы просто хотите, чтобы команды выполнялись последовательно, используйте ";" разделитель команд:

г! добавить 1; добавить 2; добавить 3; добавить 4; шоу

Другие вопросы по тегам