Вам необходимо переместить
[-s "/home/bleakcabal/.dnx/dnvm/dnvm.sh" ] &&. "/home/bleakcabal/.dnx/dnvm/dnvm.sh" # Загрузите строку dnvm
из вашего .profile в .bashrc (или .zshrc).
Действительно, в вашем коде diff
получает вывод kill
вместо program
. Вы можете решить эту проблему, объединив команды перед каналом в подоболочке с ()
.
Другая потенциальная проблема с вашим скриптом заключается в том, что kill
не предназначен для ожидания завершения program
; вместо этого он просто посылает ему сигнал. Поэтому вы можете столкнуться с состоянием гонки, когда diff
работает, не перехватывая весь вывод program
. Я советую программно дождаться завершения фонового процесса с помощью встроенной команды wait
bash.
Вот пример вашего кода, содержащего вышеуказанные исправления:
#!/bin/bash
(
./program <input1.txt &
PID=$!
sleep 1
kill -INT $PID
wait
) | diff -y reference_output.txt -
Вы можете использовать замену процесса[1]:
diff -y output1.txt <(your_program & sleep 1; kill $!)
Если your_program
способен генерировать огромные объемы данных за секунду (, как при тестировании с помощью yes(1)
), то diff
будет очень трудно справиться с этим, и если вы не наложите какие-то осторожные ограничения, на месте это может снести вашу память и повесить вашу машину (и в лучшем случае создаст иллюзию того, что команда какое-то время "зависает" ). Вместо yes
попробуйте скрипт slowyes
, например while echo y; do sleep.01; done
.
Обратите внимание, что замена процесса <(...)
выполняется параллельно ,поэтому diff
не будет ждать завершения, прежде чем начать обработку своих данных.
Я думаю, вам будет лучше остановить your_program
после того, как он сгенерирует некоторое количество строк, а не через некоторое время:
diff -y output1.txt <(your_program | head -n 1000)
В этом случае your_program
должен быть уничтожен SIGPIPE
, как обычно, с левой стороны конвейера. Если ваша программа игнорирует как ошибки SIGPIPE
, так и write(2)
, то, пожалуйста, задайте другой вопрос об этом, либо как это исправить, либо как обойти это.
[1] если ваша оболочка не поддерживает замены процессов (как /bin/sh
в debian, а не bash
), вы также можете использовать конвейер, как в другом ответе
{ your_program & sleep 1; kill $!; } | diff -y output1.txt -
Те же оговорки применимы и к этому случаю.