конвейерная обработка собственных команд gogoshell

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

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

or

1
3
4
2

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


person user2982622    schedule 10.09.2014    source источник


Ответы (1)


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

Команда «добавить» в вашем примере не использует и не создает данные о стандартном вводе/выводе и, следовательно, не подходит для запуска в конвейере.

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

грамм! добавить 1; добавить 2; добавить 3; добавить 4; показывать

person Derek Baum    schedule 17.11.2014