2020-03-17 21:26:29 -04:00
|
|
|
local serial = require "serialization"
|
2020-03-17 10:11:53 -04:00
|
|
|
local shell = {}
|
|
|
|
shell.include = {"shutil"}
|
|
|
|
local function shindex(self,k)
|
|
|
|
if rawget(self,k) then return rawget(self,k) end
|
|
|
|
for _,v in pairs(os.getenv("INCLUDE") or shell.include) do
|
|
|
|
if require(v)[k] then return require(v)[k] end
|
|
|
|
end
|
|
|
|
if package.loaded[k] then return package.loaded[k] end
|
|
|
|
return _G[k]
|
|
|
|
end
|
|
|
|
|
2020-03-17 23:03:23 -04:00
|
|
|
local function formatValue(v)
|
|
|
|
if type(v) == "table" then
|
2020-03-24 01:26:48 -04:00
|
|
|
local w, rs = pcall(serial.serialize,v,true)
|
2020-03-17 23:03:23 -04:00
|
|
|
if w then return rs end
|
|
|
|
end
|
|
|
|
return tostring(v)
|
|
|
|
end
|
|
|
|
|
2020-03-17 10:11:53 -04:00
|
|
|
function shell.interactive()
|
|
|
|
local shenv = setmetatable({}, {__index=shindex})
|
|
|
|
local run = true
|
|
|
|
while run do
|
2020-03-25 23:41:06 -04:00
|
|
|
io.write(string.format("\27[32m%s:%s>\27[0m ",os.getenv("HOSTNAME") or "localhost",(os.getenv("PWD") or _VERSION)))
|
2020-03-17 10:11:53 -04:00
|
|
|
local input = io.read()
|
|
|
|
if input:sub(1,1) == "=" then
|
|
|
|
input = "return "..input:sub(2)
|
|
|
|
end
|
|
|
|
local f, r = load(input, "shell", "t", shenv)
|
|
|
|
if not f then
|
2020-03-25 23:41:06 -04:00
|
|
|
print("\27[31m"..r)
|
2020-03-17 10:11:53 -04:00
|
|
|
else
|
|
|
|
local rt = {pcall(f)}
|
|
|
|
local rs = table.remove(rt,1)
|
2020-03-25 23:41:06 -04:00
|
|
|
if not rs then io.write("\27[31m") end
|
2020-03-17 10:11:53 -04:00
|
|
|
for k,v in pairs(rt) do
|
2020-03-17 23:03:23 -04:00
|
|
|
print(formatValue(v))
|
2020-03-17 10:11:53 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return shell
|