lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


2010/7/6 Alexander Gladysh <agladysh@gmail.com>:
>> What you can do is introduce some helper code to run external
>> utilities more easily. For example you could put a __index hook on _G
>> (or a module), that would check if a command line utility with the
>> given key exist in the path, and would wrap a call to io.popen in a
>> Lua function, with proper whitespace escaping. For example you could
>> then write :
>
>> local files = find('.', '-name' '*foo*')
>> for _,file in files:match('[^\n]+') do
>>    print(stat('%n is a %F', file))
>> end
>
>> Where find and stat are wrappers for the command line tools.
>
> That's a nice idea!
>
> I would put such hook into a separate table though — to avoid name clashes.
>
> Also, how to do piping nicely with this approach?

Instead of calling the function directly, the wrapper could return a
"command" object, that you would have to execute ([[ find('.',
'-name', '*foo*') ]] -> [[ find('.', '-name', '*foo*')() ]]. And you
could put a piping operator in there to chain commands. For example :

local files = (shell.find('.', '-size', 0) .. shell.grep('*foo*'))()
for _,file in files:match('[^\n]+') do
    print(shell.stat('%n is a %F', file)())
end

You could also feed some string to the command or command chain,
passed in the last parenthesis pair, that would be inserted as stdin :

local output = ( commandA .. commandB .. commandC ) ( input )

Would be roughly equivalent to :

cat input | commandA | commandB | commandC > output