Почему моя программа постоянно выполняется, если в качестве аргумента используется "<<<"?

Вам может понадобиться следующий sedскрипт:

sed -n '$p;N;s/[[:blank:]]*\n[[:blank:]]*;/;/;P;D' csv_file

Разобрано для объяснения:

$p;      # at last line of stream, just print it
N;       # append the next line from input so that we always consider two lines at a time...
s/[[:blank:]]*\n[[:blank:]]*;/;/; # then replace `\n;` (and any leading and trailing blanks) with just `;`, and...
P;       # print only the _first_ of the two lines present in memory and...
D        # then delete it and read one new line if memory becomes empty

Обратите внимание, что первая команда, $p, на самом деле выводит что-то, только если общее количество входных строк нечетное, потому что остальная часть скрипта гарантирует, что в памяти всегда есть две строки из входного потока

1
21.04.2021, 23:59
1 ответ

<<<не «непрерывно отправляет строку». Он отправляет строку только один раз. Точнее, он создает временный файл, содержащий строку, и открывает его на стандартном вводе программы.

Похоже, что эта программа глючит и перематывает входной поток, когда он достигает конца.

Чтобы обойти эту ошибку, используйте конвейер для отправки входных данных вместо временного файла. Труба не может быть перемотана, так что это не вызовет эту конкретную ошибку.

echo G |./program.exe

Использование конвейера может вызвать другую ошибку. Некоторые программы действительно плохо работают, когда их ввод не поступает с терминала. Если конвейер не работает, следующим шагом будет использование expect для запуска программы с фактическим терминалом (без взаимодействия с пользователем :expect управляет взаимодействием ). Expect позволяет вам контролировать, что отправляется и принимается на терминале, а также когда это отправляется. Вот сценарий ожидания, который имитирует вводGEnter сразу после запуска программы:

#!/usr/bin/expect -f
spawn./program.exe
send "G\r"
3
28.04.2021, 22:51

Теги

Похожие вопросы