Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Modified shell to run commands async when you run a command with an '&' at the beginning
- -- example: "/home # &file.lua"
- local shell = require("shell")
- local tty = require("tty")
- local text = require("text")
- local sh = require("sh")
- local thread = require("thread")
- local args = shell.parse(...)
- shell.prime()
- if #args == 0 then
- local has_profile
- local input_handler = {hint = sh.hintHandler}
- while true do
- if io.stdin.tty and io.stdout.tty then
- if not has_profile then -- first time run AND interactive
- has_profile = true
- dofile("/etc/profile.lua")
- end
- if tty.getCursor() > 1 then
- io.write("\n")
- end
- io.write(sh.expand(os.getenv("PS1") or "$ "))
- end
- tty.window.cursor = input_handler
- local command = io.stdin:readLine(false)
- tty.window.cursor = nil
- if command then
- command = text.trim(command)
- if command == "exit" then
- return
- elseif command ~= "" then
- if string.sub(command, 0, 1) == "&" then
- thread.create(function()
- local result, reason = sh.execute(_ENV, string.sub(command, 2))
- if not result then
- io.stderr:write((reason and tostring(reason) or "unknown error") .. "\n")
- end
- end)
- else
- --luacheck: globals _ENV
- local result, reason = sh.execute(_ENV, command)
- if not result then
- io.stderr:write((reason and tostring(reason) or "unknown error") .. "\n")
- end
- end
- end
- elseif command == nil then -- false only means the input was interrupted
- return -- eof
- end
- end
- else
- -- execute command.
- local result = table.pack(sh.execute(...))
- if not result[1] then
- error(result[2], 0)
- end
- return table.unpack(result, 2)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement