O problema é que a saída de ./program -a asdf
fica armazenada em buffer quando executada no pipeline, e que qualquer saída será armazenada no buffer até que esta fique cheia.
Você pode controlar o buffer de saída de um comando usando stdbuf
; em particular, para executar ./program -a asdf
com um stdout
sem buffer:
stdbuf -o0 ./program -a asdf
Para que seu pipeline bufferizado se torne:
stdbuf -o0 ./program -a asdf | script.sh