I would like to do the following:
- Start an external command
- Read lines from the command
- If the line contains a certain text, kill the external command
- Return once all lines are read
Is there a simple way to achieve this? The best I have come up with is this:
function getoutput()
write("tmp.txt","line 1\nline 2\nline 3")
out = PipeBuffer()
process = run(pipeline(`cat tmp.txt`,out),wait=false)
lines = String[]
lookfordata = true
while lookfordata
l = readline(out)
isempty(l) || push!(lines,l)
occursin("2",l) && (kill(process); break)
sleep(0.001) # helper line, without which the while never returns
lookfordata = !eof(out) || process_running(process)
end
lines
end
lines = getoutput()
display(lines)
Note in particular the “helper line” sleep(0.001)
. Without this, or another “helper line”, the while loop never returns. Another helper line that does the trick is a print statement, e.g. println("Hello!")
. This is puzzling to me…
I have tried using eachline(`cat tmp.txt`)
in a for-loop:
for l in eachline(`cat tmp.txt`)
push!(lines,l)
occursin("2",l) && break
end
This is much more compact. However, now the break
does not kill the process, so it does not meet my requirements.
I am using Julia 1.1. I am happy to hear any thoughts!