-
-
Notifications
You must be signed in to change notification settings - Fork 319
Description
This was a weird one to try and debug, reproduction requires a Linux system with snap installed, which likely means some Debian derived distribution.
To most easily reproduce, install jq via apt, and yq via snap, save the following as something like /tmp/snap_output_lost.lua, and in neovim run something like :=luafile /tmp/snap_output_lost.lua:
local ok, j = pcall(function()
return require("plenary.job"):new({
command = "jq",
args = { "--version" },
on_exit = vim.schedule_wrap(function(j, code)
vim.notify("jq j.result: " .. vim.inspect(j:result()))
end),
})
end)
vim.notify("jq ok: " .. vim.inspect(ok))
local spawn_ok, err = pcall(j.start, j)
vim.notify("jq spawn_ok: " .. vim.inspect(spawn_ok) .. ", err: " .. vim.inspect(err))
local ok, j = pcall(function()
return require("plenary.job"):new({
command = "yq",
args = { "--version" },
on_exit = vim.schedule_wrap(function(j, code)
vim.notify("yq j.result: " .. vim.inspect(j:result()))
end),
})
end)
vim.notify("yq ok: " .. vim.inspect(ok))
local spawn_ok, err = pcall(j.start, j)
vim.notify("yq spawn_ok: " .. vim.inspect(spawn_ok) .. ", err: " .. vim.inspect(err))On my system, the output from jq is printed, and the output from yq is lost.
Which leads to the next question: Why?
(This took a bit to figure out.)
If you run some long running program installed via snap, launch it with the above, and look at /proc/<pid>/fd/[012], you'll find that they are all sockets.
I'm not yet sure why that matters, but a script that redirects everything to force stdout and stderr to be pipes instead of sockets seems to work for me:
#!/bin/bash
yq "$@" > >(cat) 2> >(cat >&2)